From nobody Sat Apr 20 08:57:17 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+69950+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+69950+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 1610045348805912.4596893425315; Thu, 7 Jan 2021 10:49:08 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 0W0tYY1788612xVveRTT5HN7; Thu, 07 Jan 2021 10:49:08 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.85]) by mx.groups.io with SMTP id smtpd.web12.1067.1610045342805755640 for ; Thu, 07 Jan 2021 10:49:03 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=H1wigj17ykPLBu8pUezlE1OoAGdHsdDxUGvGF2UJeDFkAWJ1KJ8DzIC84EAHXUO43cirqYQuT4dq90CDoEnnSofW31heCTRUfdx0o341BLzsZtJ//io/tWS3OUJiELjjj1blo4DT6p1vi0/CcGQwlaMfMBKxIsVlxcsq2Qzrac+ga+64C+hTXDyGhWrSD6BNi/9fXoX3aAVSAV2O4ikBWRmeG/0j1r/gQdz2NjRViVN8zQkaSjecJu327q06kzIedxjxKr+tY55AHoytoWqsO58RApkFpWn/XSu9wqVi//+kjLyCzH5AlvxOrhAzIC0Ud2n59hEg+hsGY91okI32og== 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=oO1K9D4ut2PUpPlrsE3RGduw7Jd3LKdGpZ8TKzmjinY=; b=LNau2xTzwFvKjz4QY3AQ66bPxfNdpPs/8pd5CTGecPwn9crd/9c2FUXb/b65g1OxLVRM7kVHBwqJvtySWjFYFtoI9DwetP8sj0dr4CgVgImWrIAsiVdUb45JqCyDSMsZcn70Ct24kuVX0WvsCBG09GGKqCzzaqMjZJ59uNGntyTZNKGFujgA5qCPYAapB+l3yGGoE/YwY9K6Fsh6tlAPuyr+pYkBSnsPfVRndph5xtD3vgUt/ucKsyo19Nokjw5pdKT3IhxMP3p70HyBYtU/x+ZFvKIRdpLiKPRVi2fEHShEwdLvDDHwAcQjGsUdPsTOmHm6xztkQWnBfegbyRH28g== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:49:00 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:49:00 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [edk2-devel] [PATCH v3 01/15] Ovmf/ResetVector: Simplify and consolidate the SEV features checks Date: Thu, 7 Jan 2021 12:48:11 -0600 Message-ID: <43a660624c32b5f6c2610bf42ee39101c21aff68.1610045305.git.thomas.lendacky@amd.com> In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SN6PR16CA0048.namprd16.prod.outlook.com (2603:10b6:805:ca::25) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by SN6PR16CA0048.namprd16.prod.outlook.com (2603:10b6:805:ca::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:48:59 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 1915a915-5337-4bff-c07d-08d8b33ce584 X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:5236; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: TCf56SqreMijylbZlkp+IUmveuO4j1JKPUnKwL3PCLwrrpjgKsTbKSwAEw317Cfxftg7iHVYUV4qlYhSw69kDQK1kMpqv+6sfeDWMqoxFOnvevwZXAiYsyhDMW3ZH1iesUhY1Kc17Yqr9WQyXX69FWyMshHhfLXPgo05krSNEhzmEXi0YfGPjYKdCsd4WjQa/5SanjPX8lJfKVz7Mc2wh0aDVWGxA7GV3bjW6Ak67iennsY2KMKZkFqNOLm2WaxaYDz2cONr1a0BMB5wpVwXtMseoXg8WzdFo7qPf2jt6MyIuD7TBRTRonRWUOCnIEVXDAGYO6GJxM+pgE9LMpWi0WW2HtMpakYsORKfG+ivCdNs6fxucikHEcAW1x+tXZIEUyAMFKQZNxFGspivCfqPEyMInu49TIxIMswvmRouKaI+8W2KDw8/WHCgG9GfZLHByzdV1Bfc4BoecBpKVpVByg== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?/+eyVQN5AMuEuClvO6ineCpFiTD/GRS+iKr3c0nQOFcOaYI8uFxMVsQba+ei?= =?us-ascii?Q?nY3G92ccZO6sYQyTlFeMMWcwjA88EPwbU05YKsHMIN8RoiSkKP7Gv7Vu7dOk?= =?us-ascii?Q?u21cWkFwx9mEqnf/kxOb9IeuJhuQcov8dAkvRJzo7xPbj8f/GP7/c5OTEbdL?= =?us-ascii?Q?sU8BFDNf7qMmQt50KQOdVlX4XRTY9Y8E32TnVOWXeq/XIZM7OaKQAOVHnjZ9?= =?us-ascii?Q?LhO9ZCKc6j/VLc7eHHOInMOPki8A0qaqBTVvwpcODzs2Rlx1KFQgRgRabSPR?= =?us-ascii?Q?GWKCnMXffG3aSa9h2bMMfa1qcf8V7g571kXkOyWIKqmZtuKuDtQrJFwo+NHb?= =?us-ascii?Q?izgjfJIXWPiwVgif/NCGqhKUw0rDtsmOUN7SbHT+KuLe22UKIueDJU/MaeZj?= =?us-ascii?Q?KyN7gfmthgJ5mDjeYGDwLqA5sVs39YTjM6IZ5Sx7SgtIFlem0DQOMh1chJEv?= =?us-ascii?Q?b3SFBghqTkemiGS3UE3YxAmdayIokg2U3zLR4LXGJi4uciCvWeEPkiEOeU9P?= =?us-ascii?Q?7Sj3sXki+nHb7wcL18vtBmzYW6OJZaIxXlEDI0p9SxqIg/GUxIdhL/sEVHGa?= =?us-ascii?Q?BMP5puk5BNUdFriZjQsRNFf7UtAA75ZAEYKoxyZ3ndhGpaQe2gceG2dqwpVW?= =?us-ascii?Q?L5ZKOUH2ToC+5CIYRpFsaPuL1HP6I8sBkN3UgK9rYVahhX0ojCNCS3Z1cfE8?= =?us-ascii?Q?N4wnheM0p5AX2VDeuvAi4B+mOzXHgYMdW2s87K7pHYR7bJZu3bsZpxzyCIxp?= =?us-ascii?Q?BOWNdtwynwryCTzpoZFWXj+gjUrGCD4rgfjX7QAZbMpz9s9HyIMEXt2vEeLE?= =?us-ascii?Q?T0ZjFvttxFCyexnkjPlOkJAjaIHeWwZdK7l8fX+9De7Tt68kO2NDiZZ/GDse?= =?us-ascii?Q?LZkgzQs5QtWD7ctWOEfQgdW9OZaw2wZh3120XfsgdpdIePEvS5Z/Eia0691/?= =?us-ascii?Q?wq0KqaOqr6Kb/qap2VVvo/RAPz1ZO797/ttoG9ktdC3frrJnAeBBhXsgn35V?= =?us-ascii?Q?vB6h?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:49:00.1647 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: 1915a915-5337-4bff-c07d-08d8b33ce584 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Snw4n7mtUaRb66OqHejqZDyddLEsERFmmaHu9KGsxQ8Z4GxfIZFZqhSBmQQU3ZVbUIqLRpPBSVrrcdp8LpogqQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: zSjhWLA6SkHz4Ld8dRqTIk6Rx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045348; bh=jW9/Ct5SKrmZ0FGOUQSk5mrHp0PT2PXRwgBVncB/8gE=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=Er3AN37VD3fKdjWinr7lamQRD1zGwlvwB0iuCP+aC3ajxPNHMYDBjRPQ3FmkHnzfWrH s1TMGU3s2dJTLHy6nPy6SFibAAdafDeiFJP/624q+Bd9sPVuURrPmECWI1FYoYDNeHcTy 8GL2LMBooKrtDKUsRCAFjCmdrHg6aQSt/hA= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 Simplify and consolidate the SEV and SEV-ES checks into a single routine. This new routine will use CPUID to check for the appropriate CPUID leaves and the required values, as well as read the non-interceptable SEV status MSR (0xc0010131) to check SEV and SEV-ES enablement. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Brijesh Singh Reviewed-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/ResetVector/Ia32/PageTables64.asm | 75 ++++++++++++-------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/OvmfPkg/ResetVector/Ia32/PageTables64.asm b/OvmfPkg/ResetVecto= r/Ia32/PageTables64.asm index 7c72128a84d6..4032719c3075 100644 --- a/OvmfPkg/ResetVector/Ia32/PageTables64.asm +++ b/OvmfPkg/ResetVector/Ia32/PageTables64.asm @@ -3,6 +3,7 @@ ; Sets the CR3 register for 64-bit paging ; ; Copyright (c) 2008 - 2013, Intel Corporation. All rights reserved.
+; Copyright (c) 2017 - 2020, Advanced Micro Devices, Inc. All rights reser= ved.
; SPDX-License-Identifier: BSD-2-Clause-Patent ; ;-------------------------------------------------------------------------= ----- @@ -62,18 +63,22 @@ BITS 32 %define CPUID_INSN_LEN 2 =20 =20 -; Check if Secure Encrypted Virtualization (SEV) feature is enabled +; Check if Secure Encrypted Virtualization (SEV) features are enabled. +; +; Register usage is tight in this routine, so multiple calls for the +; same CPUID and MSR data are performed to keep things simple. ; ; Modified: EAX, EBX, ECX, EDX, ESP ; ; If SEV is enabled then EAX will be at least 32. ; If SEV is disabled then EAX will be zero. ; -CheckSevFeature: +CheckSevFeatures: ; Set the first byte of the workarea to zero to communicate to the SEC ; phase that SEV-ES is not enabled. If SEV-ES is enabled, the CPUID ; instruction will trigger a #VC exception where the first byte of the - ; workarea will be set to one. + ; workarea will be set to one or, if CPUID is not being intercepted, + ; the MSR check below will set the first byte of the workarea to one. mov byte[SEV_ES_WORK_AREA], 0 =20 ; @@ -97,21 +102,41 @@ CheckSevFeature: cmp eax, 0x8000001f jl NoSev =20 - ; Check for memory encryption feature: + ; Check for SEV memory encryption feature: ; CPUID Fn8000_001F[EAX] - Bit 1 ; CPUID raises a #VC exception if running as an SEV-ES guest - mov eax, 0x8000001f + mov eax, 0x8000001f cpuid bt eax, 1 jnc NoSev =20 - ; Check if memory encryption is enabled + ; Check if SEV memory encryption is enabled ; MSR_0xC0010131 - Bit 0 (SEV enabled) mov ecx, 0xc0010131 rdmsr bt eax, 0 jnc NoSev =20 + ; Check for SEV-ES memory encryption feature: + ; CPUID Fn8000_001F[EAX] - Bit 3 + ; CPUID raises a #VC exception if running as an SEV-ES guest + mov eax, 0x8000001f + cpuid + bt eax, 3 + jnc GetSevEncBit + + ; Check if SEV-ES is enabled + ; MSR_0xC0010131 - Bit 1 (SEV-ES enabled) + mov ecx, 0xc0010131 + rdmsr + bt eax, 1 + jnc GetSevEncBit + + ; Set the first byte of the workarea to one to communicate to the SEC + ; phase that SEV-ES is enabled. + mov byte[SEV_ES_WORK_AREA], 1 + +GetSevEncBit: ; Get pte bit position to enable memory encryption ; CPUID Fn8000_001F[EBX] - Bits 5:0 ; @@ -132,45 +157,35 @@ SevExit: pop eax mov esp, 0 =20 - OneTimeCallRet CheckSevFeature + OneTimeCallRet CheckSevFeatures =20 ; Check if Secure Encrypted Virtualization - Encrypted State (SEV-ES) feat= ure ; is enabled. ; -; Modified: EAX, EBX, ECX +; Modified: EAX ; ; If SEV-ES is enabled then EAX will be non-zero. ; If SEV-ES is disabled then EAX will be zero. ; -CheckSevEsFeature: +IsSevEsEnabled: xor eax, eax =20 - ; SEV-ES can't be enabled if SEV isn't, so first check the encryption - ; mask. - test edx, edx - jz NoSevEs + ; During CheckSevFeatures, the SEV_ES_WORK_AREA was set to 1 if + ; SEV-ES is enabled. + cmp byte[SEV_ES_WORK_AREA], 1 + jne SevEsDisabled =20 - ; Save current value of encryption mask - mov ebx, edx + mov eax, 1 =20 - ; Check if SEV-ES is enabled - ; MSR_0xC0010131 - Bit 1 (SEV-ES enabled) - mov ecx, 0xc0010131 - rdmsr - and eax, 2 - - ; Restore encryption mask - mov edx, ebx - -NoSevEs: - OneTimeCallRet CheckSevEsFeature +SevEsDisabled: + OneTimeCallRet IsSevEsEnabled =20 ; ; Modified: EAX, EBX, ECX, EDX ; SetCr3ForPageTables64: =20 - OneTimeCall CheckSevFeature + OneTimeCall CheckSevFeatures xor edx, edx test eax, eax jz SevNotActive @@ -229,7 +244,7 @@ pageTableEntriesLoop: mov [(ecx * 8 + PT_ADDR (0x2000 - 8)) + 4], edx loop pageTableEntriesLoop =20 - OneTimeCall CheckSevEsFeature + OneTimeCall IsSevEsEnabled test eax, eax jz SetCr3 =20 @@ -336,8 +351,8 @@ SevEsIdtVmmComm: ; If we're here, then we are an SEV-ES guest and this ; was triggered by a CPUID instruction ; - ; Set the first byte of the workarea to one to communicate to the SEC - ; phase that SEV-ES is enabled. + ; Set the first byte of the workarea to one to communicate that + ; a #VC was taken. mov byte[SEV_ES_WORK_AREA], 1 =20 pop ecx ; Error code --=20 2.30.0 -=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 (#69950): https://edk2.groups.io/g/devel/message/69950 Mute This Topic: https://groups.io/mt/79505865/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- From nobody Sat Apr 20 08:57:17 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+69951+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+69951+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 1610045383035771.8158040329979; Thu, 7 Jan 2021 10:49:43 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id X3LmYY1788612xVUEFa4nluk; Thu, 07 Jan 2021 10:49:42 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.50]) by mx.groups.io with SMTP id smtpd.web10.1119.1610045382021677844 for ; Thu, 07 Jan 2021 10:49:42 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=O1ydxNw6q6oUz0PQ6jWynBPos2100spusw37Lho7ah1DrO2gKh67rvy40fD6aExstQFkLMrKyhvs455NNQXRvbO1xJ9+/Z0NvkNJmi8Gfvyh6U8eYXKp4ntJHYJq2ByQZkjvo9mSwlu3SuktfRFGUI+KqYptYsm56Cu1BiBuDN+CbUqTmo1YHNfSYPzNpAsnX3Phq/+gEsGmSzpTaEgXtEYvFR0FDZkAk7UgPdSpsbsuCCn9uf8IRx9B0Nns6DB9eZZGGTRMOdVDcW/ulNUodEYEb0xrS3H5AVfZ+gCzPsQuf/8KOTXg331s/1MD6PJMdC6QDo51r3U6GIUjpTWN1A== 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=HGEREPRNXQk83pP8EiRBPA2oNXtsGdt9PxMVo5ZUkg0=; b=Vm1O7J18eNIYhG3/6Xtl1fQK/H2yZVNUukG3+OlOsMebvqZzNDTAxlveHLev6BH3S2/zphiIrIMC0yzJfi/3TF5P6igNmgsolXSQSHwgVU6+V868FmBxVQCV+fSK6hHYtav2LzNtO5z2u1Q5zlEv6+gVS6vvP9ZkMMvLTD17kREy+PQtK2a4k0M+n00x6KzkIPlvpmXJVk58JcV6OYzlva/+PcsjIyzhLYj/HsiRz6W9E8OXcuqzyXiF5RtMcbBxvUupOEboShzE/0NfYItHUYe1vVWIqkBp7g4TIX8aemvTbkT8TnadLdV2MYUcM5uTZLk8QAPILMkys0dskN8vuQ== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:49:39 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:49:39 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [edk2-devel] [PATCH v3 02/15] OvmfPkg/Sec: Move SEV-ES SEC workarea definition to common header file Date: Thu, 7 Jan 2021 12:48:12 -0600 Message-ID: <07d66f3384bd54da97d540e89b9f3473a6d17231.1610045305.git.thomas.lendacky@amd.com> In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SN6PR16CA0038.namprd16.prod.outlook.com (2603:10b6:805:ca::15) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by SN6PR16CA0038.namprd16.prod.outlook.com (2603:10b6:805:ca::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:49:38 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: fb4dca70-5685-40fd-5488-08d8b33cfcf0 X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:5797; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: knjkx5oxS0LLqoWE4ylJ/ayyCf9AZizFuYx5w35rVVb//ydyNJJLcR0SzYegZtWZX47m/kLXaoUS9QBr6jbqxDVd5NKH4AKbRDw04SJ0JbGOMxLjcLqu/we1FyMygZviz3sk6zvQhzfzw5mm5hQiclOvmkhnTGBhMZ0HbeZtEVHnCbNsLJsLyRwDH9DQTMTwTfh2JXM8oIQcjswddsdhRX8vN151l2cimjn/kWwJiL1uTcEzE5X6NKrDkIZ1L29Vl9r3aR/PFTtF6GE3DfaPjG6e+hKATwYQJGxliVQsCGHylrQV/eCj2nWC7CeBgM4qAEyFUSv6VlV8O6hQZ+s5OKYAJtu9xmB/GtCc8cY4tAQOKI2xqa07WTbV3o3AH7qy7R4UHfjqQVWoJP5JuHpv2FBNdk/0PjzazjTGpr7k04qhbRiCXdR4Ouri5PD8RkQ9MDwjTmBeksvE/7rVNgAUNg== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?q+317ZiEdmxwdjsSGzeqkMqcqjoETXl6hJ7A5UiHC4WSYLHqjD3OsAor4XZd?= =?us-ascii?Q?MNISUXqaCUMwnBT6NS3OfiqwrtwqjXIl1lARFyhMcpGwC0TI/djWNWQ+yRfE?= =?us-ascii?Q?KKSvORNd1kn+5FKRAQ9h5c79zzsnr+aDUc8bbXQsm3A5Qrs/fq+xU2HLgB48?= =?us-ascii?Q?tSGEY5USGi4c0819l1iNbGZR/igz5gm+9dDU6srDznDF9i9NWRbyAB9m241m?= =?us-ascii?Q?3MJenAA96/nKtYL/Vrv9hJ5MRJxD7zH0jwGHVaFCWS7BRIIcSOaTqTT0sAAG?= =?us-ascii?Q?ppEziKVdc0/5K4I1SFZRWztx15Dpxg6LWUYQaTi0Ov05Use8eD1xhycZ+7YW?= =?us-ascii?Q?KxsK0uKAhRFGDX74L0OQWxl0qmYu0mu9AskDSsMm5Ul9uJmPpmvCNP14lqhW?= =?us-ascii?Q?NU3vKTacCxdIqjTczTkeon2fQ5FVVLZMZfaNpg0sCULRKxxLZJaqkfWUt0qH?= =?us-ascii?Q?KoSyTaj5iUxlBBR+RYqYb1FnoeCD8LkBSCLX7oZRuGWwNvsXp9noJ7iQwk4M?= =?us-ascii?Q?jMPF50tZlfbDChR38rs/ow+HzczdVLU6t7IJmPXnEI/GgR1cu1F4o2wMSddM?= =?us-ascii?Q?/EGmC8oAJCOT+0JZNqyPQ0FEqSITk7n93KjXggOAJ3YHvOzzO6bxssP0nYbU?= =?us-ascii?Q?aiJ30aQFg6zXpoj0FRBJtoF103ACbnFu8zPdIAoGguN99zCL/hx7JplL5nKR?= =?us-ascii?Q?qYxcSQKYZgOWQ471NzJLlYuOA2RJ8v4AtPh+pfv5Jvs6mcGiRFqEYmlpHR2+?= =?us-ascii?Q?LS9qastk7Hp27QwrfcxUW6W8E1t0irgXuLEacM3P7rNT9zdv1ROy2x6MrgjO?= =?us-ascii?Q?TKidRKzres6oMHj0VwP6mhOYKt8q6laM45lvaucLR78kvwCyN5E52fvRXG6u?= =?us-ascii?Q?RotggIHDKho4T9hmBh6VYqndI5ac7Wpf2Cgo5XdoLC5pOPyygTgSaPgBu+VV?= =?us-ascii?Q?CUUSmYlUOwXr21qwx2iVxxcPEFaIEsw1MGQltUUKJ8Uh+xZthWQiurU0gHky?= =?us-ascii?Q?O4kq?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:49:39.5023 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: fb4dca70-5685-40fd-5488-08d8b33cfcf0 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: xippP+l5B5rfKpVRw6Na7uMpr2nInqA/V/wWq6HcYBFqBGlhn7W916Kpuf22RVvCw86ErGLEVCTVStTvi45ZUQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: Mg6LgpHLq7Ym6i942MlBuLcXx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045382; bh=HkV+a9pnxbB0dqgMpKdh5AMb9FTtoHGyRMJtbFooEF4=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=iF859pYDJ7n2GpXOOhdDS1UOk2LMo8EDe4r2fUBjLl/VcGYz3sV21L+02++5bOspKj7 G3HLhUNos2sfoGKwhIKZGYQoxLJNoCIN7xUNY2PLECyyr0PzJRJR5KpyaMkmnJ/JgpQc6 X09Qjv7y9YkKWLTQfDNlWfGtva5d5uLjnn0= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 In order to allow for the SEV-ES workarea to be used for other purposes and by other files, move the definition into the BaseMemEncryptSevLib header file, MemEncryptSevLib.h. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Brijesh Singh Reviewed-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/Include/Library/MemEncryptSevLib.h | 16 +++++++++++++++- OvmfPkg/Sec/SecMain.c | 6 ++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/OvmfPkg/Include/Library/MemEncryptSevLib.h b/OvmfPkg/Include/L= ibrary/MemEncryptSevLib.h index fc70b0114354..a6d82dac7fac 100644 --- a/OvmfPkg/Include/Library/MemEncryptSevLib.h +++ b/OvmfPkg/Include/Library/MemEncryptSevLib.h @@ -2,7 +2,7 @@ =20 Define Secure Encrypted Virtualization (SEV) base library helper function =20 - Copyright (c) 2017, AMD Incorporated. All rights reserved.
+ Copyright (c) 2017 - 2020, AMD Incorporated. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -13,6 +13,20 @@ =20 #include =20 +// +// Internal structure for holding SEV-ES information needed during SEC pha= se +// and valid only during SEC phase and early PEI during platform +// initialization. +// +// This structure is also used by assembler files: +// OvmfPkg/ResetVector/ResetVector.nasmb +// OvmfPkg/ResetVector/Ia32/PageTables64.asm +// any changes must stay in sync with its usage. +// +typedef struct _SEC_SEV_ES_WORK_AREA { + UINT8 SevEsEnabled; +} SEC_SEV_ES_WORK_AREA; + /** Returns a boolean to indicate whether SEV-ES is enabled. =20 diff --git a/OvmfPkg/Sec/SecMain.c b/OvmfPkg/Sec/SecMain.c index 63aca7020727..9db67e17b2aa 100644 --- a/OvmfPkg/Sec/SecMain.c +++ b/OvmfPkg/Sec/SecMain.c @@ -3,6 +3,7 @@ =20 Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.
(C) Copyright 2016 Hewlett Packard Enterprise Development LP
+ Copyright (c) 2020, Advanced Micro Devices, Inc. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -25,6 +26,7 @@ #include #include #include +#include #include #include =20 @@ -37,10 +39,6 @@ typedef struct _SEC_IDT_TABLE { IA32_IDT_GATE_DESCRIPTOR IdtTable[SEC_IDT_ENTRY_COUNT]; } SEC_IDT_TABLE; =20 -typedef struct _SEC_SEV_ES_WORK_AREA { - UINT8 SevEsEnabled; -} SEC_SEV_ES_WORK_AREA; - VOID EFIAPI SecStartupPhase2 ( --=20 2.30.0 -=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 (#69951): https://edk2.groups.io/g/devel/message/69951 Mute This Topic: https://groups.io/mt/79505882/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- From nobody Sat Apr 20 08:57:17 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+69952+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+69952+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 1610045396844597.7373438660336; Thu, 7 Jan 2021 10:49:56 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id PDL5YY1788612xTs0vY85wgR; Thu, 07 Jan 2021 10:49:55 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.84]) by mx.groups.io with SMTP id smtpd.web10.1125.1610045389790134580 for ; Thu, 07 Jan 2021 10:49:50 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=T/yEDJVKc/p+6WWZl3fWCRSHNMhwRDfybJPUhsRuWSG+B20JsqrQ5Bsi0RHvoFCQxVq+4IyERAQhL7oqW7P4qtby6eYVlF8wUTlcZ5b+GKwBFJ8/1/pN4CHvgX6RhqkrAiVg9J/yH+19posTRF1kwgdpidWI0xLWTVu6eW+YHXPxOPsbFbo9UOGlTr1DGJO02KqkC0X9IwtxM5m+Unaxy5sIjH4kINL57atJlm/AL2/bc6ql6qDPOu+J3jLhmNqVxCMbTpa+HiZqdpZwxVjpxxsGG4pags4eAiVubemdJZTjCF9beK0U6HOg0xSjm4i8LHJVXR7rY6g8XdeTLBP/0w== 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=OTh4hohiDu88SGE8ARY51sHUHt+yCYlsbSMsVrewsRs=; b=Uigym0PUphw5VpZKOTzmcp/jgDl8ugARJLtQ17mq5kPEvM/JXzcaiomARzK0vzzQrzHvfawVlMrgELKk5RTeN7xRFFNevTUrFnsR7uxbr/A9Gz/PH+jPJHkk5SjA6Vme5Z2cQsOkNrZjHdmVKIn12XQQ4YSgLbyGPn/imiZ7hbzrKlehuLlJQGRIEnfhROjfUE/F5UK5g01VcJPBtaDc499xGkI/Tjdeh0Mcxu+aiEGZpRbsfPZgaw7r0sw5DYsz198jAou7uXYlCOkV+/EAeLUtd/xl192AXCU4ynMTCuMgPEwshjcp9UgdEjMEDMZm5Y7qsLosXGXWg/8AYrkxrA== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:49:47 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:49:47 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [edk2-devel] [PATCH v3 03/15] OvmfPkg/ResetVector: Validate the encryption bit position for SEV/SEV-ES Date: Thu, 7 Jan 2021 12:48:13 -0600 Message-ID: In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SN1PR12CA0055.namprd12.prod.outlook.com (2603:10b6:802:20::26) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by SN1PR12CA0055.namprd12.prod.outlook.com (2603:10b6:802:20::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:49:46 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 89a8abb3-dabe-462e-a352-08d8b33d0177 X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:5236; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: Bb/B3kENZEPhAweDi34bn0YgqnydbNG+nVkn+nwashjLWn4ZWks9L63onbZVxIChuPO4nyGpgZSynLq1BhfCYRr+EyV5iocKfacBPWYypmLWsFn55mqV8uyltbO8P2giOebBvaddGuJ0EXXoArqW+CRhmCVYW3m3C+3k0bTJmULBVHnb1EldOJ1fF9bRO5tOjeYAIPx+deqc1D8+7PMQ9BYKMA0vXz/JH+LIrv7Nte8K56bMw/6rKYC0y9mu9i0Gq4Aq8YZpF6f+HWLIJcGNt/ZcJwU2MnrqtI840pzUDhjC0v5LHrPzzI4d6GQ62ubPlzn7G3NSw6NFBHC1dU79OFzgfzd6oa8M1+3vEeowKx2STJfQp3twxpGz8OQldIw9rpHOc7DnXTwCBjkDxcSblnweRrQ3ap/nOdw+rUo49qXYRyEIPchRHWP2ow+iNmx/gHYSJasgIe6DoGks8P/LyA== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?zBNYGJqkekyZc7xf+zxNNg2pWO0whR7mE4qlayCLUma8ojPP9Cn+9mHlgwnb?= =?us-ascii?Q?l5rmhy3R6L8JFEXy0FqlFpFBDuHPyq4MN8XbNr45s2/ZrskuGWFWna5gJk+o?= =?us-ascii?Q?T3gr4FopytneWFmpEaom9e+eU0+BHjlIU8eMFewEIhboRoBdj+ioXjrGIvWb?= =?us-ascii?Q?QrkdJt7HV5GXn86EYe36Bfq3o0EFsRPmNuNFeK8VLVckKcOkDG69MWFh6b+T?= =?us-ascii?Q?ZSqf7Fb4TEbWy36z0NuphmeuINi1OM5xJbDJM8oRh6+wemf6gdMc2lr7UoPp?= =?us-ascii?Q?WfTlfrG6HAc9BDM8A1IOtg5w2hs6A1ebxcpCkWkklE0qgM8xWitmEfV0tvxy?= =?us-ascii?Q?KVHwtTjKo7Du2D4oqMd6bCZ+wau3XfG3J8GerbxKoztjeMCwpWo3qRyD8QQY?= =?us-ascii?Q?U2BeQMknCTxkzvBeQNHDN4uTPgcA+qVIwO8AGryDteAyisx9nnQCALzh9ya/?= =?us-ascii?Q?W69VcirdeD50nG6SVveloJs1/3yUigMkD05JxONCH+VrzL3pYmjjp3GWiKMt?= =?us-ascii?Q?KIBxqG7MWgaIKG4QfRnUqILzTrkU0caNGQ7/M2Drge78MX2lWguVTnjzDlrR?= =?us-ascii?Q?+ILeJLAtdbief/l1E+y8EZcrD8cK+neO8hd76CfWNgkByKt0a6c7Ve+lmtg1?= =?us-ascii?Q?pGpGoWy1nYSxnp4uucW7vjIog/Bc7tHBWWkI8S26fS05TyURYVg0CXFgC4sE?= =?us-ascii?Q?AgkPatotf1QhqWAJFqfFeRAZzoiC82VqeT3iCYWzkESVbBYnqoKrGK+F1kQw?= =?us-ascii?Q?llVH1oIE/79X/c3VpkuD8zwBlSoxZMXPh2ydKpDDZxbXlAsmwUQSd+148hAR?= =?us-ascii?Q?wcLj4X81+Ut46CFCFoE8W0cFvAuMx8+AjuMKmbn4MupLNQfKdvlfE5R2blix?= =?us-ascii?Q?I/LER3XWA0dH6TWnaPeoRP3Q8ISSqBprKzYKRqti8/EHm2GFejyo6FAIlkoe?= =?us-ascii?Q?Xro1cagXqreixBVcoaKLiRsbqameIrYjMnOqZT5s3kGpuL6gcg6Me+mF39XW?= =?us-ascii?Q?k0I9?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:49:47.0920 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: 89a8abb3-dabe-462e-a352-08d8b33d0177 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: CWc92UVacwJRtS2GGqnzMCKv9cb+CICFFLh/O0IlzKBO6dycUXnbJcPOFpcJ5VNXTvS5nhnokv0zp5J3n1MLnw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: ynzaQWMLLSgj4G2xRRpIyOgpx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045395; bh=MauDvhqRu/hScJGr9oDOcf9TpugQZ2SjbOV3VJX31oo=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=gG2Gq59SVx4Ud6a5Pw7YnzwTorR4o80R42cRlLC3UyTscirIf/3H5/u1T02S7RVhyLn mKoFuHe9Ks5WTijFXWSjkRlj104cM7BNRiFUFv1Q3eDb3VQHXcEizg0qCu4L7FtseaUQE safoHqUklThJgAS7pM/hA61sA4nhLtRcFME= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 To help mitigate against ROP attacks, add some checks to validate the encryption bit position that is reported by the hypervisor. The first check is to ensure that the hypervisor reports a bit position above bit 31. After extracting the encryption bit position from the CPUID information, the code checks that the value is above 31. If the value is not above 31, then the bit position is not valid, so the code enters a HLT loop. The second check is specific to SEV-ES guests and is a two step process. The first step will obtain random data using RDRAND and store that data to memory before paging is enabled. When paging is not enabled, all writes to memory are encrypted. The random data is maintained in registers, which are protected. The second step is that, after enabling paging, the random data in memory is compared to the register contents. If they don't match, then the reported bit position is not valid, so the code enters a HLT loop. The third check is after switching to 64-bit long mode. Use the fact that instruction fetches are automatically decrypted, while a memory fetch is decrypted only if the encryption bit is set in the page table. By comparing the bytes of an instruction fetch against a memory read of that same instruction, the encryption bit position can be validated. If the compare is not equal, then SEV/SEV-ES is active but the reported bit position is not valid, so the code enters a HLT loop. To keep the changes local to the OvmfPkg, an OvmfPkg version of the Flat32ToFlat64.asm file has been created based on the UefiCpuPkg file UefiCpuPkg/ResetVector/Vtf0/Ia32/Flat32ToFlat64.asm. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Brijesh Singh Reviewed-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/Include/Library/MemEncryptSevLib.h | 4 + OvmfPkg/ResetVector/Ia32/Flat32ToFlat64.asm | 118 ++++++++++++++++++++ OvmfPkg/ResetVector/Ia32/PageTables64.asm | 13 ++- OvmfPkg/ResetVector/ResetVector.nasmb | 4 +- 4 files changed, 136 insertions(+), 3 deletions(-) diff --git a/OvmfPkg/Include/Library/MemEncryptSevLib.h b/OvmfPkg/Include/L= ibrary/MemEncryptSevLib.h index a6d82dac7fac..dc09c61e58bb 100644 --- a/OvmfPkg/Include/Library/MemEncryptSevLib.h +++ b/OvmfPkg/Include/Library/MemEncryptSevLib.h @@ -21,10 +21,14 @@ // This structure is also used by assembler files: // OvmfPkg/ResetVector/ResetVector.nasmb // OvmfPkg/ResetVector/Ia32/PageTables64.asm +// OvmfPkg/ResetVector/Ia32/Flat32ToFlat64.asm // any changes must stay in sync with its usage. // typedef struct _SEC_SEV_ES_WORK_AREA { UINT8 SevEsEnabled; + UINT8 Reserved1[7]; + + UINT64 RandomData; } SEC_SEV_ES_WORK_AREA; =20 /** diff --git a/OvmfPkg/ResetVector/Ia32/Flat32ToFlat64.asm b/OvmfPkg/ResetVec= tor/Ia32/Flat32ToFlat64.asm new file mode 100644 index 000000000000..c6d0d898bcd1 --- /dev/null +++ b/OvmfPkg/ResetVector/Ia32/Flat32ToFlat64.asm @@ -0,0 +1,118 @@ +;-------------------------------------------------------------------------= ----- +; @file +; Transition from 32 bit flat protected mode into 64 bit flat protected mo= de +; +; Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.
+; Copyright (c) 2020, Advanced Micro Devices, Inc. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +;-------------------------------------------------------------------------= ----- + +BITS 32 + +; +; Modified: EAX, ECX, EDX +; +Transition32FlatTo64Flat: + + OneTimeCall SetCr3ForPageTables64 + + mov eax, cr4 + bts eax, 5 ; enable PAE + mov cr4, eax + + mov ecx, 0xc0000080 + rdmsr + bts eax, 8 ; set LME + wrmsr + + ; + ; SEV-ES mitigation check support + ; + xor ebx, ebx + + cmp byte[SEV_ES_WORK_AREA], 0 + jz EnablePaging + + ; + ; SEV-ES is active, perform a quick sanity check against the reported + ; encryption bit position. This is to help mitigate against attacks wh= ere + ; the hypervisor reports an incorrect encryption bit position. + ; + ; This is the first step in a two step process. Before paging is enabl= ed + ; writes to memory are encrypted. Using the RDRAND instruction (availa= ble + ; on all SEV capable processors), write 64-bits of random data to the + ; SEV_ES_WORK_AREA and maintain the random data in registers (register + ; state is protected under SEV-ES). This will be used in the second st= ep. + ; +RdRand1: + rdrand ecx + jnc RdRand1 + mov dword[SEV_ES_WORK_AREA_RDRAND], ecx +RdRand2: + rdrand edx + jnc RdRand2 + mov dword[SEV_ES_WORK_AREA_RDRAND + 4], edx + + ; + ; Use EBX instead of the SEV_ES_WORK_AREA memory to determine whether = to + ; perform the second step. + ; + mov ebx, 1 + +EnablePaging: + mov eax, cr0 + bts eax, 31 ; set PG + mov cr0, eax ; enable paging + + jmp LINEAR_CODE64_SEL:ADDR_OF(jumpTo64BitAndLandHere) +BITS 64 +jumpTo64BitAndLandHere: + + ; + ; Check if the second step of the SEV-ES mitigation is to be performed. + ; + test ebx, ebx + jz InsnCompare + + ; + ; SEV-ES is active, perform the second step of the encryption bit post= ion + ; mitigation check. The ECX and EDX register contain data from RDRAND = that + ; was stored to memory in encrypted form. If the encryption bit positi= on is + ; valid, the contents of ECX and EDX will match the memory location. + ; + cmp dword[SEV_ES_WORK_AREA_RDRAND], ecx + jne SevEncBitHlt + cmp dword[SEV_ES_WORK_AREA_RDRAND + 4], edx + jne SevEncBitHlt + + ; + ; If SEV or SEV-ES is active, perform a quick sanity check against + ; the reported encryption bit position. This is to help mitigate + ; against attacks where the hypervisor reports an incorrect encryption + ; bit position. If SEV is not active, this check will always succeed. + ; + ; The cmp instruction compares the first four bytes of the cmp instruc= tion + ; itself (which will be read decrypted if SEV or SEV-ES is active and = the + ; encryption bit position is valid) against the immediate within the + ; instruction (an instruction fetch is always decrypted correctly by + ; hardware) based on RIP relative addressing. + ; +InsnCompare: + cmp dword[rel InsnCompare], 0xFFF63D81 + je GoodCompare + + ; + ; The hypervisor provided an incorrect encryption bit position, do not + ; proceed. + ; +SevEncBitHlt: + cli + hlt + jmp SevEncBitHlt + +GoodCompare: + debugShowPostCode POSTCODE_64BIT_MODE + + OneTimeCallRet Transition32FlatTo64Flat + diff --git a/OvmfPkg/ResetVector/Ia32/PageTables64.asm b/OvmfPkg/ResetVecto= r/Ia32/PageTables64.asm index 4032719c3075..ccc95ad4715d 100644 --- a/OvmfPkg/ResetVector/Ia32/PageTables64.asm +++ b/OvmfPkg/ResetVector/Ia32/PageTables64.asm @@ -140,9 +140,18 @@ GetSevEncBit: ; Get pte bit position to enable memory encryption ; CPUID Fn8000_001F[EBX] - Bits 5:0 ; + and ebx, 0x3f mov eax, ebx - and eax, 0x3f - jmp SevExit + + ; The encryption bit position is always above 31 + sub ebx, 32 + jns SevExit + + ; Encryption bit was reported as 31 or below, enter a HLT loop +SevEncBitLowHlt: + cli + hlt + jmp SevEncBitLowHlt =20 NoSev: xor eax, eax diff --git a/OvmfPkg/ResetVector/ResetVector.nasmb b/OvmfPkg/ResetVector/Re= setVector.nasmb index c5e0fe93abf4..d3aa87982959 100644 --- a/OvmfPkg/ResetVector/ResetVector.nasmb +++ b/OvmfPkg/ResetVector/ResetVector.nasmb @@ -3,6 +3,7 @@ ; This file includes all other code files to assemble the reset vector code ; ; Copyright (c) 2008 - 2013, Intel Corporation. All rights reserved.
+; Copyright (c) 2020, Advanced Micro Devices, Inc. All rights reserved.
; SPDX-License-Identifier: BSD-2-Clause-Patent ; ;-------------------------------------------------------------------------= ----- @@ -67,13 +68,14 @@ %endif =20 %define PT_ADDR(Offset) (FixedPcdGet32 (PcdOvmfSecPageTablesBase) + (Off= set)) -%include "Ia32/Flat32ToFlat64.asm" =20 %define GHCB_PT_ADDR (FixedPcdGet32 (PcdOvmfSecGhcbPageTableBase)) %define GHCB_BASE (FixedPcdGet32 (PcdOvmfSecGhcbBase)) %define GHCB_SIZE (FixedPcdGet32 (PcdOvmfSecGhcbSize)) %define SEV_ES_WORK_AREA (FixedPcdGet32 (PcdSevEsWorkAreaBase)) + %define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 (PcdSevEsWorkAreaBase) + = 8) %define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase)= + FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)) +%include "Ia32/Flat32ToFlat64.asm" %include "Ia32/PageTables64.asm" %endif =20 --=20 2.30.0 -=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 (#69952): https://edk2.groups.io/g/devel/message/69952 Mute This Topic: https://groups.io/mt/79505888/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- From nobody Sat Apr 20 08:57:17 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+69953+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+69953+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 1610045398018906.6276528748347; Thu, 7 Jan 2021 10:49:58 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id KDMoYY1788612xYcz07A7iRH; Thu, 07 Jan 2021 10:49:57 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.66]) by mx.groups.io with SMTP id smtpd.web11.1087.1610045397079595040 for ; Thu, 07 Jan 2021 10:49:57 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OOf1S34RlUGKtW6zwwvTMO1lFwgwDopPmlq3dqU2ZXH+CDRD1dWgj+HXqhmDzVWGlMlmw8GI3RKVZD7AZACy4IgWITylVoJi09MuLh4/U22gv1LWS70mamO024BG+joHi5dHpsRSolNllChNduReONL+wugl4Iy+oNOMFrpWqQbqq8fZ8QARI7rq1kG3dVUn7B7QEQFwEeqahlUfZDwngfPFpx1wG8AsKacwIPbOSpQDhiVSeDvXTXkIDrN9mto8XqaEKBs/x6f+SK4pQw/Co55WVUHw0V4jmQOpI684aaYSfrPEwOSVStXWlO+SZpIJ4biItia/7DMd3dNFWh9mvg== 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=Fl5c+WUyti+6Z3EUPP8krTRnKF8JE7UIwuZUxS7tsxY=; b=I9vEHQm0EIRHcivkJ4W31+g7L9fd0O5+QnpAkFkMbO20wlijCvcb+d1NW7PmJ5vXj7I6xUWYjK68XQbbFxJHsEUKnzGnJut49CUd2dtQh3FIdNyIHPv2EbQWgbLcCbNi1UGxa4jD6f69ErhzPC4UGtHjsWgUPTAuFuh9zre3lVydxZc69Ql6J4tBI/60C8/tVRU5qO/H8VNpM6i3g9RNEskyr69qrYgHDoyCfVlCBqY1DO+LRMWFzLYh4YRI4umJCkbgzsvbF/pe5OKe24KTFBjqEnF1BJjAwOx/tJe5lnc4m6Hi2I3jn9APWjO1vjMTyNgUTR61e/q0uUc0CL9v2A== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:49:54 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:49:54 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [edk2-devel] [PATCH v3 04/15] OvmfPkg/ResetVector: Perform a simple SEV-ES sanity check Date: Thu, 7 Jan 2021 12:48:14 -0600 Message-ID: In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: DM6PR02CA0113.namprd02.prod.outlook.com (2603:10b6:5:1b4::15) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by DM6PR02CA0113.namprd02.prod.outlook.com (2603:10b6:5:1b4::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:49:54 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: f3251cc0-05e4-4ad1-56f9-08d8b33d05e3 X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:1247; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: XQGAqrO7jQleTLPkjBZl9x4C2wm6wn6kFRJzkPjFvIdIvqxsGp+DL/RN5BE6UthDe/SwhXnFuGM4uEtKXznKo1mFe4sg43xs9JBhD/fKpcuNn4G9laeglC4Lnz/y0ItwTok5uEkElcPDDgohYeCuFqU25voTsBkItoBr70jMVuwejeurK/pqtY7aVXg2SK+Cq/mwpt/m8fPskcGbHGJXkTGNHEodT6DPhkx88YS3BxS4GSszQPccOPQFl4KoejvaJ+P9vUP91rBqaRclEqGVt0lPqZ8KKvT1WAmsoj1gVNU+orrGRFXz43r4oFlU6R96dyPgCjc9JdUx836S7oLPGXyes4TgrtNq/BpdxIpwNPQzChzxbgYaeF/WrWHokTj/8WhgAOqak0JeEBZD4svWZ2iNw6XJgjCP72YGYjOgtj23FPE9a2K5R1eRp8ln2WlifChT5h12PklEWH3LXSUpLw== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?vS0BT574Lkp1fcpx6SFEM4c83W6yfT3R5Djq97lNZ8aHasFPT+sH8/OT/td8?= =?us-ascii?Q?W1rL1/fVvkD4sewVDdhh1/klU+4L97AlymUuM7I8CC8cDcBSmw/KrbUfkfjN?= =?us-ascii?Q?06jPxIp3gIsDhyGHDQpLXSADT8XdVUd3Y0fHBIXDOFFG41qr5sGut57DbOt5?= =?us-ascii?Q?909qB99icQ5hD6X91UKjrjzb7SEqtx8C7hdyAH+G+0bVwNKP9MeDkm9YGXqW?= =?us-ascii?Q?T5PTcO5UmDPP9OFafA1Aj1fyAzYepuBzQxol9DN7eDxDS8T3go1JeCfG7+Lo?= =?us-ascii?Q?hy8uh6PUBqvk6Z+rLZ39QyJDmxzVM6fizt+rNcCyqotMgSlm6wlwS+1gwxJu?= =?us-ascii?Q?HCUXLR81w5+rboo2EMlH66kiM8AR1n/4EY8r5VX/merH8hYvTTjAf3y+t8nz?= =?us-ascii?Q?gunTdcp6J9nUgQ16C0BoBZiidaWc6qwqi67vABnwIkDgtaUDubZ0NnBiU8Cy?= =?us-ascii?Q?VvHJFs/45QvkiVgw7ccz5E88xXA0At6aU9d0jCzb5QTzeNK7qX0/esAiYHaz?= =?us-ascii?Q?286iXxcOTz8DFv2YfzrnKMgI1l+S6wbJENZW2kBOHtNeFn8D3sHQ7ErLjnkQ?= =?us-ascii?Q?WIvfAv4gD+XhUXvXRQcbp0m0jdi91CPVf8Nupx9gTV1qsD2mpuFxmlCCHJp5?= =?us-ascii?Q?W9q9eC1yrV0hZzPIRiMKQHZqoQDH1C6wEWOj+oI2tqA1LI6OlSmmW7iKOPr0?= =?us-ascii?Q?wobeG7lM77tO/ciWeaNfBeChWF67Z30azEhzyAhewauhzmSCb4nAwWHYVHpD?= =?us-ascii?Q?cXUUl9YCqQHfRxJUUQGHPcrFdmSb4DZCDD4eC2BMwbIuyFzBw4tEkeKVl5ru?= =?us-ascii?Q?VV5Q6qSusAMXJMS7ix+qR/b0UzlvRbrjHA4XiyC2Cr5Ber/fYVIB5FzG2VRx?= =?us-ascii?Q?MTRZPWoLJ7arYlLtaNcOWU4sCWl+Yj7pmPACImUER4l3XuAj3N5KJ5vM3lPy?= =?us-ascii?Q?0F3ouKTjSls7AmMqV2Bxy4zO8k99GthYy85lPeOYsIhVE5rUpu1QYjy0D9Fi?= =?us-ascii?Q?2qS8?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:49:54.5797 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: f3251cc0-05e4-4ad1-56f9-08d8b33d05e3 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 50/TDZL5bcze3VxmkkzWS0fyRCbAHRtYccZX6GtCdoYHlyyt126LG/y5MKGuGukcVRY+p6yO0Dk28rP84OeLZA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: p5ZI8GBK6rDLUx6U5rTBmAdYx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045397; bh=plNhCOfkap99i8jxGHaFrY4s7+f4yvmAb6vD/vng0Hg=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=IVUGzC+Z+9sxUI2apDlniBJFOr1rf2DVcMZuFa1BpVIbDPqMTo/lNSIiOo/W5sH/6Ht 33eyVKfDa1eQfQ39TP2HoXiHiyFypfD+EHfK7ZfUJQX7YfzXL7ZiBp9l4/rWOz7n8OkpA HnEbP+Gd2B4A0XlkJjPyW5dczqK1b+XYyVo= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 If a hypervisor incorrectly reports through CPUID that SEV-ES is not active, ensure that a #VC exception was not taken. If it is found that a #VC was taken, then the code enters a HLT loop. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Brijesh Singh Reviewed-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/ResetVector/Ia32/PageTables64.asm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/OvmfPkg/ResetVector/Ia32/PageTables64.asm b/OvmfPkg/ResetVecto= r/Ia32/PageTables64.asm index ccc95ad4715d..a1771dfdec23 100644 --- a/OvmfPkg/ResetVector/Ia32/PageTables64.asm +++ b/OvmfPkg/ResetVector/Ia32/PageTables64.asm @@ -154,6 +154,22 @@ SevEncBitLowHlt: jmp SevEncBitLowHlt =20 NoSev: + ; + ; Perform an SEV-ES sanity check by seeing if a #VC exception occurred. + ; + cmp byte[SEV_ES_WORK_AREA], 0 + jz NoSevPass + + ; + ; A #VC was received, yet CPUID indicates no SEV-ES support, something + ; isn't right. + ; +NoSevEsVcHlt: + cli + hlt + jmp NoSevEsVcHlt + +NoSevPass: xor eax, eax =20 SevExit: --=20 2.30.0 -=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 (#69953): https://edk2.groups.io/g/devel/message/69953 Mute This Topic: https://groups.io/mt/79505889/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- From nobody Sat Apr 20 08:57:17 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+69954+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+69954+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 1610045405466100.31178311414135; Thu, 7 Jan 2021 10:50:05 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id OVtNYY1788612xyPTWImjDYF; Thu, 07 Jan 2021 10:50:05 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.76]) by mx.groups.io with SMTP id smtpd.web09.1114.1610045404595933728 for ; Thu, 07 Jan 2021 10:50:04 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ijIGw8g0iPZcSU05haQWk1jSAm1AaYobGFt8ByhjK2MC5aYsntNKpoJULhbdc3buuuF4ai9Yggvh2YlsetqJz1FXxukcuL4o2tEiASiEAZqOK+bY3fh6HX1aC7t83w7VLWwh3zEPDOL9Tu4V1PUJlWVWEhbUrM78LwkEtnP8mtTdw9/q+66wrfQGlVOi6hPWERKh/kg8xSqye5Jc3+rmA1yC0BqFR6F0A2tP5lNckDjPTjy4hS8ZDs/BpK9HwHNuXDPImdkSO7POqT3tT53cbuK9Ppo/N1kCho14Bf0V7Jca7ERcqvterL3XjX+NCcMxcBM31YJNGkn+HEOId14/jA== 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=dUtGaYd1tpdJVMzOA49uF3PSmI6aCbdZsqdZTq99y5k=; b=eI1c00AwCFwyqPyzNf5bNfFkf0gKIRlLs1z3ppktaPiinnS+Rh3u6cSpHXNftHhV34BemeyQACd57lH4Q4VZ5iqtkCwBJ8yvmBrIw7bWKEO3ZkzUut18jpvmCPHA1/VtnEyx4eU5o6D4mBSVigu7J3utAEUi5ZfXYs37nDjTQ8OUEdeD4keRO8ohAKHpqz0Clb0/to0IMBXw6ulMd3iBlIysLTwnXskRK7cTc71AktXPCLKWA7bW1GD2B1EaK3i02E9EtKocuk1dHAIVSdjHyDIFswGE1NQ21BaQaFbUYuCL1j2onSC8/rYnYQJRFgF7gALIYCzIZzvZt1o9fcXjUA== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:50:02 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:50:02 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [edk2-devel] [PATCH v3 05/15] OvmfPkg/ResetVector: Save the encryption mask at boot time Date: Thu, 7 Jan 2021 12:48:15 -0600 Message-ID: <2609724859cf21f0c6d45bc323e94465dca4e621.1610045305.git.thomas.lendacky@amd.com> In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: DM3PR12CA0100.namprd12.prod.outlook.com (2603:10b6:0:55::20) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by DM3PR12CA0100.namprd12.prod.outlook.com (2603:10b6:0:55::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:50:01 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 01cece98-e22f-426e-6093-08d8b33d0a66 X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:4125; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: G7+f9MCId5+EBIRQ907FJLo5w34sieAKzk9x8KqybKU3uVUGx4MHNf6aIYoq5qzS35+AKzxMYPTJoSNmxt+7X4cMgF8n5fi6JxnIiuEFPoZPcaVCncX6Dz4dyBnekPIx+pRBw/cflRPqUbk3n3g079v7GEwHwGRGJzXZl5ettordcP2VcQCGt18JA8B+daH+GFfNZDaQZAl8tPm/X1Ec9Ftb/7k4tZ680SwXW73xiT6hlA0Se9I4SWCVyql3RekR2uWOiF0IRBgijbZTmoZm9cDUOTvfxFs0t/pJCWNqsjWtjvq3IoVXWU1/x7rNHIc0oi4eL1pZ/WhDyclcp/amRMxIA5y7UUb/qUnaNVkCoWP+N6BfokUuJcVZp8iv843DywdNH/HfRXdkkiKUY8Pog5CGZXWhJXsrG1E8bqTUMbvpOXTTFqrMh8+jwGOAxKlB2oUzjEHtPT71i1o5I+07oQ== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?yHWlTM7NGeLMV9if91STZBZem6zt3mhbkBGpgOz7PIRxuxRAgUTFXqXZsqTe?= =?us-ascii?Q?lwZYZoxQ34kZ/4hzlQbY7eak5r/q8xRWDm1B1GhfCHZQ+xKD0zD4BEcROoc/?= =?us-ascii?Q?UYavVQq20yz6U9xodHzgPtnLEgt3+WXE9ApJ9FwpNrmG10q7vYKK+4sPJWZE?= =?us-ascii?Q?xvwUWur8HTe7zQJd+2IEGqAKowzmAN0nP0aSGrRwHM5kqqXB71oEMd+kyvGR?= =?us-ascii?Q?dEu2ZqKgamoTry7vXbRbvQBVkUV8eClWGjjoqDxf92DUWdAaFtiE7SSILe4P?= =?us-ascii?Q?sez6lXl3wH2EZ9ay9PlZhVs5xXcLGq15HDIaiKumoVdHp/Uj99T8m86K5s7X?= =?us-ascii?Q?DjgM9GZF2bhdS1vQUfkPaOqVBz7z2LeyWKox5IqRU6G7rRwyVHSf6T2ewtr1?= =?us-ascii?Q?9cDggL4ivYy/ifKkOX17s1YOdardn6qrYEiNRAsm50Rz4zO4G6rc+rkj0EIx?= =?us-ascii?Q?mauMpiPkg8Ye/xjlFt49j4NAnj9BfHXZ2ta0rMw7jPTc+ASIyUzuEyJsEiVC?= =?us-ascii?Q?IKiHjvf9dDzDbZcEs6IoWvKjb2c+RaIiZMsb7XNL8hHHOEnxZyOacH2lr0yj?= =?us-ascii?Q?SJGfGoJVsU6oNlvjdQ+Ls1dktXLwLjaSV6iCx/e26Uo8KvCsrUD5WheIQZhO?= =?us-ascii?Q?SiLcGkCQ5v5RysYjE7lLeJDfFbmJDttlenvS454oaEqaVY4tX614mtyQVpTm?= =?us-ascii?Q?BFiN51gz5RcMdyv9pmOi4D1jqK2jmwWLmKcUp+QpAl2OnyswjIf8oTWPAQ7j?= =?us-ascii?Q?NMtV8KF4PnATKw1YkDmPV9o9y9Vmjbxp/ektLOlGMorgFUekzskTrhzMIxZj?= =?us-ascii?Q?lgR99FZ9nhl/4/xHNBsdlpxI8jEEwHiXkqOEIRzDiVXqswk/KOtNCbAsKj2M?= =?us-ascii?Q?7UvVIn0T3/Cq7XxlvGHyumZCaZpALGIUPn7LKC5CMi5xmDAXCyrxDPkeFP9G?= =?us-ascii?Q?1QOnvv8bzjH2XVXJ95x5g3UGmfD1OcuxQMCjpUMSfp8uJCfd43LTjQldsLrE?= =?us-ascii?Q?p2bp?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:50:02.1133 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: 01cece98-e22f-426e-6093-08d8b33d0a66 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Qt60jkBGabJPPvrbQpzzwLc2h/Wl6CN0lkcAUa4qDrnRFw5NuzSftBM8hwDh3jbWK1+yhIt5wrgEKjDa7/TODg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: r3mJNpU7rWgfto3g1vX52TW5x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045405; bh=BWwG3MCOCK9uDsnpqLTC4DbLTYdSAz9FciE8eb7TkjQ=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=h8OFAKZq9b4Xdt981EYWrXY5PMU9ND7gEHJFK4vDLNmB4QrsqCaayh5k9qsvW36clN8 zKcDXIv4PF81Damj/2CDCnwrQYDe2CR4LnINqIm543jPeoHFIdHuopshsi+l2jzXA+6qH t11QhMb5YhIbpm8NCy/H85LPvKwf7p2gKus= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 The early assembler code performs validation for some of the SEV-related information, specifically the encryption bit position. To avoid having to re-validate the encryption bit position as the system proceeds through its boot phases, save the validated encryption bit position in the SEV-ES work area for use by later phases. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Brijesh Singh Reviewed-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/Include/Library/MemEncryptSevLib.h | 2 ++ OvmfPkg/ResetVector/Ia32/PageTables64.asm | 10 +++++++++- OvmfPkg/ResetVector/ResetVector.nasmb | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/Include/Library/MemEncryptSevLib.h b/OvmfPkg/Include/L= ibrary/MemEncryptSevLib.h index dc09c61e58bb..a2c70aa550fe 100644 --- a/OvmfPkg/Include/Library/MemEncryptSevLib.h +++ b/OvmfPkg/Include/Library/MemEncryptSevLib.h @@ -29,6 +29,8 @@ typedef struct _SEC_SEV_ES_WORK_AREA { UINT8 Reserved1[7]; =20 UINT64 RandomData; + + UINT64 EncryptionMask; } SEC_SEV_ES_WORK_AREA; =20 /** diff --git a/OvmfPkg/ResetVector/Ia32/PageTables64.asm b/OvmfPkg/ResetVecto= r/Ia32/PageTables64.asm index a1771dfdec23..5fae8986d9da 100644 --- a/OvmfPkg/ResetVector/Ia32/PageTables64.asm +++ b/OvmfPkg/ResetVector/Ia32/PageTables64.asm @@ -145,7 +145,7 @@ GetSevEncBit: =20 ; The encryption bit position is always above 31 sub ebx, 32 - jns SevExit + jns SevSaveMask =20 ; Encryption bit was reported as 31 or below, enter a HLT loop SevEncBitLowHlt: @@ -153,6 +153,14 @@ SevEncBitLowHlt: hlt jmp SevEncBitLowHlt =20 +SevSaveMask: + xor edx, edx + bts edx, ebx + + mov dword[SEV_ES_WORK_AREA_ENC_MASK], 0 + mov dword[SEV_ES_WORK_AREA_ENC_MASK + 4], edx + jmp SevExit + NoSev: ; ; Perform an SEV-ES sanity check by seeing if a #VC exception occurred. diff --git a/OvmfPkg/ResetVector/ResetVector.nasmb b/OvmfPkg/ResetVector/Re= setVector.nasmb index d3aa87982959..5fbacaed5f9d 100644 --- a/OvmfPkg/ResetVector/ResetVector.nasmb +++ b/OvmfPkg/ResetVector/ResetVector.nasmb @@ -74,6 +74,7 @@ %define GHCB_SIZE (FixedPcdGet32 (PcdOvmfSecGhcbSize)) %define SEV_ES_WORK_AREA (FixedPcdGet32 (PcdSevEsWorkAreaBase)) %define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 (PcdSevEsWorkAreaBase) + = 8) + %define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 (PcdSevEsWorkAreaBase) = + 16) %define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase)= + FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)) %include "Ia32/Flat32ToFlat64.asm" %include "Ia32/PageTables64.asm" --=20 2.30.0 -=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 (#69954): https://edk2.groups.io/g/devel/message/69954 Mute This Topic: https://groups.io/mt/79505895/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- From nobody Sat Apr 20 08:57:17 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+69955+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+69955+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 1610045418787379.77426455529326; Thu, 7 Jan 2021 10:50:18 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id EYcHYY1788612xRexqU8JcvY; Thu, 07 Jan 2021 10:50:18 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.79]) by mx.groups.io with SMTP id smtpd.web08.1126.1610045413410361394 for ; Thu, 07 Jan 2021 10:50:13 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dFXN43LDGMde/4fKPbgiemI2F+0tEF3KrZ9SosxQmUn5q2Rt2pOWSZkliWrDELC3ttEa9KW7cQVnUg2gnHRXPJr/hWhHqklgUBp0njlDKVfTRbeO5VmFMk88uooKk3KFta/PLr/ONYHdRl1OoTnEUCguW5F4N+jcApvLIucFnCsR6e+2TsMovChbgQjmpzevd8STjb5RvGeTtA51LLpW75S9r9CtHVbusmDl9ttr3DQcmzs9hdAcCmmhl9lUsDwkR9Wvf3G3ZZdkvWX/ELQsl3NYzCOu0n/VBS8kAtWi+2J3s6mUfbiSCTrXXJ6dPCWVUmiog3mlJtghOR1azLqKEw== 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=2+fMoLkWftGuwu7BRNWUwC5aeS2V9r+7q8tWlp0S4k8=; b=SksOxTiXOCIlWi/Vkf8166b3GZWMtGlt9ckloueUgnhZcJ/JEqG/qeuStGVtS+IIxw9xzUeTkBEdKUF3y9rczVCQw8k1R5QbtKVkmJMTFl72tBFoXjzt0FWaMCHCLzi4ANtt/dkSOiY2QN6s1YVx44RM3T58c1V+hj3LSMe8IGpWp3HN/wOKIJOUbarloKDMvsBE4wGGCvMq5JBbaXygXEY1qeOUY2juyfAaoRfB18RbHd+leqnOqALDLJKiIN1jbJ8VznWMmtKAgpsHlEei6KWm44z4JHIcNklw2iOxMGNQ7arWn2/Dt5gzKFZR8ngRSJKgekd9nW/e7X9wM3G0Ng== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:50:10 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:50:10 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel , Rebecca Cran , Peter Grehan , Anthony Perard , Julien Grall Subject: [edk2-devel] [PATCH v3 06/15] OvmfPkg/MemEncryptSevLib: Add an interface to retrieve the encryption mask Date: Thu, 7 Jan 2021 12:48:16 -0600 Message-ID: In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: DM5PR22CA0003.namprd22.prod.outlook.com (2603:10b6:3:101::13) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by DM5PR22CA0003.namprd22.prod.outlook.com (2603:10b6:3:101::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:50:09 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: df962f26-8845-4a65-cc01-08d8b33d0f1e X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: 4tJZkO7adLREXNVSws+YaYgBcGdqTMZpzOQYsaEfJzUEQEQaP50dbZ5AVE46meDHt5y9CA+92H8Wp6kd91Dw/7f7gdFiJnzFXiGZKxilRvXUQksPFbHXtoS1huU9HanwBhifPuFV3WCQdpYuzCwnLmXWZZs8NNUq7g1HUau2I6270reQ2kH5eQelV2m8gsNNNNO87OwtGM4MjaVAI1iviv1vHB4iADRqNV4W7dKvHOB+ZQuBTjSnUPvRVnQLb9xSMoGl8gw4fDazyFjO+/kNSNSEGMqPSpJ+lCeUqhLL45DOqddR+pTZqJ5khZ5R3IvfSlBWrK0wrLX5nkkkcMgHXaJKIKmWojRq63C68OMRNdFWQu5lq95+Ugy8+ag1Y1Q7fJw9s+mCO2+RM72W10bkPkv+BFBsLNq5+EFdOatFP96d3kSbbsu6iwZV8wpOiE6gHdB2gXtc8SVmlbwbM3cxDQ== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?Z1dzCpcZ/v9PjjE9B4yhprRTpin6HRxNiWhCdI2uyZ3k3FqxZs+DlZDi0uD9?= =?us-ascii?Q?hQP7Lad2462SERdZH6m/o7eb0YTjhHnsCPM2pRI5hsNdiC9Z6f80j+YGStEq?= =?us-ascii?Q?Rl1WP04nh5bzqFl4rP6YmNm4QunL3Yx4W5XNbKOgEEs71aH0yK1xRx92Pb/k?= =?us-ascii?Q?krsJD38f2ABs3I60f2gfBzFGoYjMudxPAFAIGsPWbmboBy/8Kw2Sf1ThUn6c?= =?us-ascii?Q?t5UGnd+W7o0l2awh+zOtWb7HtR6zse2g/6M5Tgi3RhHIX+lqfZphMfwoLvCB?= =?us-ascii?Q?aiqiAV9jK2ztei54nNYjmAxCXkR40nXtEf15Hgm0ro9yAl2zuMWxTErXLOjz?= =?us-ascii?Q?/bmjgGLBw5PHwSNlIxcpOWlBp7z3BZe5FxqCtsCRZWDd/3vy9JG42zYJRdHT?= =?us-ascii?Q?AnXEtQMqswu8r/0A88bldiBRly0nwkRLikYkHkbxhpa7Jj2mpmNV9Kp3032V?= =?us-ascii?Q?e4Lp0vly/tHJIw5Ultp6zXVjSxVlJb0XTXiKmyEGMJVrLKfgq6Owu1yZyAX5?= =?us-ascii?Q?R/WGOAJw2cuSw0nCAZ1aB5xW2PbfwhbNLd9PvO6vRSk/ua9XbJ31RGadL9Ys?= =?us-ascii?Q?jbt8PdEHisOy3iCWkfyeyaNN0MZh1KpNeEvRXCJi332lE5KH4w9mTNMS/a1C?= =?us-ascii?Q?tAhAkyaKuYYwPVLAfvg4owd0AhYV+X4b4lMpnASXVh195IsQFr8yzW9BGPka?= =?us-ascii?Q?lIAK4PX8+sj+8JLrAhL9GYrqBdTWFormmNcPg3SfAtEzKVokACq62gdtUK0x?= =?us-ascii?Q?EVvkQKog4Z2g8lfA2WzdQ0kbw+7M02/j8NHQVu9NqAO0+CSH7+iIQDort5H0?= =?us-ascii?Q?w8EGMxx7Eh84pHw/8W4dKun/8IH+50wTNa4vvCCo7MTmffE5mteQP3su4+Fh?= =?us-ascii?Q?jM9sx8Hk4vaF4GxFzUUnFpLDyib4KD5Rq0sq0iJ+sz0jqW1ae05l3rw5Xe3X?= =?us-ascii?Q?RzGD/4RptIENFgA6dELSuRurAba47NnLgWB2C0lB1bc36Lits9B43YJZ73Uu?= =?us-ascii?Q?N/wT?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:50:09.9869 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: df962f26-8845-4a65-cc01-08d8b33d0f1e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Pa9OL+FrkujBQrbtvBy78iOuaYCXieZYb80UPqMDU72Gl8JdepsTEahSgROyM2qy4WfDP3ib/jOCFaVusskSNg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: MzSCf5EI4cpFrZHI4vr3xYF6x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045418; bh=0VauZQvPX1w2V2/Q5Ri+yEihTvTT22/vGjdONZS8TWA=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=NdUWdKyas49HId6G0AfS/2OFyJ3tDp5+JTNX2NDkBNYucO6iHRzAGIxJrDwtU5EP7i4 OXdziHyEhorpdeEHakRPeheCBkRPnJQfwOEElZfBBVPHwHLM6JJ+QiIJgf/pHcPGatKPG D/t64Is00dwcDKOKPNn8Sut4t5eskQUHUCA= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 To ensure that we always use a validated encryption mask for an SEV-ES guest, create a new interface in the MemEncryptSevLib library to return the encryption mask. This can be used in place of the multiple locations where CPUID is used to retrieve the value (which would require validation again) and allows the validated mask to be returned. The PEI phase will use the value from the SEV-ES work area. Since the SEV-ES work area isn't valid in the DXE phase, the DXE phase will use the PcdPteMemoryEncryptionAddressOrMask PCD which is set during PEI. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Rebecca Cran Cc: Peter Grehan Cc: Anthony Perard Cc: Julien Grall Cc: Brijesh Singh Acked-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/AmdSev/AmdSevX64.dsc = | 4 +- OvmfPkg/Bhyve/BhyveX64.dsc = | 4 +- OvmfPkg/OvmfPkgIa32.dsc = | 4 +- OvmfPkg/OvmfPkgIa32X64.dsc = | 4 +- OvmfPkg/OvmfPkgX64.dsc = | 4 +- OvmfPkg/OvmfXen.dsc = | 3 +- OvmfPkg/Library/BaseMemEncryptSevLib/{BaseMemEncryptSevLib.inf =3D> DxeMem= EncryptSevLib.inf} | 15 +- OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf = | 56 +++++++ OvmfPkg/Include/Library/MemEncryptSevLib.h = | 12 ++ OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c = | 145 ++++++++++++++++++ OvmfPkg/Library/BaseMemEncryptSevLib/MemEncryptSevLibInternal.c = | 94 +----------- OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLibInternal.c = | 159 ++++++++++++++++++++ 12 files changed, 400 insertions(+), 104 deletions(-) diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc index bb7697eb324b..d39436e7afc9 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.dsc +++ b/OvmfPkg/AmdSev/AmdSevX64.dsc @@ -164,7 +164,7 @@ [LibraryClasses] QemuFwCfgSimpleParserLib|OvmfPkg/Library/QemuFwCfgSimpleParserLib/QemuFw= CfgSimpleParserLib.inf VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf - MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevL= ib.inf + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLi= b.inf LockBoxLib|OvmfPkg/Library/LockBoxLib/LockBoxBaseLib.inf CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/Customize= dDisplayLib.inf FrameBufferBltLib|MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltL= ib.inf @@ -285,6 +285,8 @@ [LibraryClasses.common.PEIM] Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf !endif =20 + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLi= b.inf + [LibraryClasses.common.DXE_CORE] HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf diff --git a/OvmfPkg/Bhyve/BhyveX64.dsc b/OvmfPkg/Bhyve/BhyveX64.dsc index b93fe30ae4e0..33edf3d2d6b5 100644 --- a/OvmfPkg/Bhyve/BhyveX64.dsc +++ b/OvmfPkg/Bhyve/BhyveX64.dsc @@ -163,7 +163,7 @@ [LibraryClasses] QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/BaseQemuFwCfgS3LibNull.inf BhyveFwCtlLib|OvmfPkg/Library/BhyveFwCtlLib/BhyveFwCtlLib.inf VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf - MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevL= ib.inf + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLi= b.inf LockBoxLib|OvmfPkg/Library/LockBoxLib/LockBoxBaseLib.inf =20 CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/Customize= dDisplayLib.inf @@ -292,6 +292,8 @@ [LibraryClasses.common.PEIM] Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf !endif =20 + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLi= b.inf + [LibraryClasses.common.DXE_CORE] HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index 26a013ec353e..75c5f46a7786 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -170,7 +170,7 @@ [LibraryClasses] QemuFwCfgSimpleParserLib|OvmfPkg/Library/QemuFwCfgSimpleParserLib/QemuFw= CfgSimpleParserLib.inf VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf - MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevL= ib.inf + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLi= b.inf !if $(SMM_REQUIRE) =3D=3D FALSE LockBoxLib|OvmfPkg/Library/LockBoxLib/LockBoxBaseLib.inf !endif @@ -310,6 +310,8 @@ [LibraryClasses.common.PEIM] Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf !endif =20 + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLi= b.inf + [LibraryClasses.common.DXE_CORE] HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index 10579fe46c5b..8693248b4ea0 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -174,7 +174,7 @@ [LibraryClasses] QemuFwCfgSimpleParserLib|OvmfPkg/Library/QemuFwCfgSimpleParserLib/QemuFw= CfgSimpleParserLib.inf VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf - MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevL= ib.inf + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLi= b.inf !if $(SMM_REQUIRE) =3D=3D FALSE LockBoxLib|OvmfPkg/Library/LockBoxLib/LockBoxBaseLib.inf !endif @@ -314,6 +314,8 @@ [LibraryClasses.common.PEIM] Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf !endif =20 + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLi= b.inf + [LibraryClasses.common.DXE_CORE] HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index c9235e48ad62..799468e08e92 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -174,7 +174,7 @@ [LibraryClasses] QemuFwCfgSimpleParserLib|OvmfPkg/Library/QemuFwCfgSimpleParserLib/QemuFw= CfgSimpleParserLib.inf VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf - MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevL= ib.inf + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLi= b.inf !if $(SMM_REQUIRE) =3D=3D FALSE LockBoxLib|OvmfPkg/Library/LockBoxLib/LockBoxBaseLib.inf !endif @@ -314,6 +314,8 @@ [LibraryClasses.common.PEIM] Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf !endif =20 + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLi= b.inf + [LibraryClasses.common.DXE_CORE] HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf diff --git a/OvmfPkg/OvmfXen.dsc b/OvmfPkg/OvmfXen.dsc index 12b7a87ee877..c13388ba5a05 100644 --- a/OvmfPkg/OvmfXen.dsc +++ b/OvmfPkg/OvmfXen.dsc @@ -161,7 +161,7 @@ [LibraryClasses] SerializeVariablesLib|OvmfPkg/Library/SerializeVariablesLib/SerializeVar= iablesLib.inf QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoad= ImageLib.inf - MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevL= ib.inf + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLi= b.inf LockBoxLib|OvmfPkg/Library/LockBoxLib/LockBoxBaseLib.inf CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/Customize= dDisplayLib.inf FrameBufferBltLib|MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltL= ib.inf @@ -273,6 +273,7 @@ [LibraryClasses.common.PEIM] QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/PeiQemuFwCfgS3LibFwCfg.inf PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLi= b.inf =20 [LibraryClasses.common.DXE_CORE] HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevLib.inf = b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf similarity index 68% rename from OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevLib.inf rename to OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf index 7c44d0952815..837db0876184 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevLib.inf +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf @@ -1,7 +1,7 @@ ## @file # Library provides the helper functions for SEV guest # -# Copyright (c) 2017 Advanced Micro Devices. All rights reserved.
+# Copyright (c) 2017 - 2020, Advanced Micro Devices. All rights reserved.<= BR> # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -10,11 +10,11 @@ =20 [Defines] INF_VERSION =3D 1.25 - BASE_NAME =3D MemEncryptSevLib + BASE_NAME =3D DxeMemEncryptSevLib FILE_GUID =3D c1594631-3888-4be4-949f-9c630dbc842b MODULE_TYPE =3D BASE VERSION_STRING =3D 1.0 - LIBRARY_CLASS =3D MemEncryptSevLib|PEIM DXE_DRIVER DXE_= RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_DRIVER + LIBRARY_CLASS =3D MemEncryptSevLib|DXE_DRIVER DXE_RUNTI= ME_DRIVER DXE_SMM_DRIVER UEFI_DRIVER =20 # # The following information is for reference only and not required by the = build @@ -29,15 +29,17 @@ [Packages] OvmfPkg/OvmfPkg.dec UefiCpuPkg/UefiCpuPkg.dec =20 +[Sources] + DxeMemEncryptSevLibInternal.c + MemEncryptSevLibInternal.c + [Sources.X64] - MemEncryptSevLibInternal.c X64/MemEncryptSevLib.c X64/VirtualMemory.c X64/VirtualMemory.h =20 [Sources.IA32] Ia32/MemEncryptSevLib.c - MemEncryptSevLibInternal.c =20 [LibraryClasses] BaseLib @@ -49,3 +51,6 @@ [LibraryClasses] =20 [FeaturePcd] gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf b= /OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf new file mode 100644 index 000000000000..c3cd046cb630 --- /dev/null +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf @@ -0,0 +1,56 @@ +## @file +# Library provides the helper functions for SEV guest +# +# Copyright (c) 2020 Advanced Micro Devices. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION =3D 1.25 + BASE_NAME =3D PeiMemEncryptSevLib + FILE_GUID =3D 15d9a694-3d2a-4184-9672-ba55c3070e07 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D MemEncryptSevLib|PEIM + +# +# The following information is for reference only and not required by the = build +# tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 +# + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + UefiCpuPkg/UefiCpuPkg.dec + +[Sources] + MemEncryptSevLibInternal.c + PeiMemEncryptSevLibInternal.c + +[Sources.X64] + X64/MemEncryptSevLib.c + X64/VirtualMemory.c + X64/VirtualMemory.h + +[Sources.IA32] + Ia32/MemEncryptSevLib.c + +[LibraryClasses] + BaseLib + CacheMaintenanceLib + CpuLib + DebugLib + MemoryAllocationLib + PcdLib + +[FeaturePcd] + gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire + +[FixedPcd] + gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase diff --git a/OvmfPkg/Include/Library/MemEncryptSevLib.h b/OvmfPkg/Include/L= ibrary/MemEncryptSevLib.h index a2c70aa550fe..872abe6725dc 100644 --- a/OvmfPkg/Include/Library/MemEncryptSevLib.h +++ b/OvmfPkg/Include/Library/MemEncryptSevLib.h @@ -135,4 +135,16 @@ MemEncryptSevLocateInitialSmramSaveStateMapPages ( OUT UINTN *BaseAddress, OUT UINTN *NumberOfPages ); + +/** + Returns the SEV encryption mask. + + @return The SEV pagetable encryption mask +**/ +UINT64 +EFIAPI +MemEncryptSevGetEncryptionMask ( + VOID + ); + #endif // _MEM_ENCRYPT_SEV_LIB_H_ diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibIntern= al.c b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c new file mode 100644 index 000000000000..2816f859a0c4 --- /dev/null +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c @@ -0,0 +1,145 @@ +/** @file + + Secure Encrypted Virtualization (SEV) library helper function + + Copyright (c) 2017 - 2020, AMD Incorporated. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include + +STATIC BOOLEAN mSevStatus =3D FALSE; +STATIC BOOLEAN mSevEsStatus =3D FALSE; +STATIC BOOLEAN mSevStatusChecked =3D FALSE; + +STATIC UINT64 mSevEncryptionMask =3D 0; +STATIC BOOLEAN mSevEncryptionMaskSaved =3D FALSE; + +/** + Reads and sets the status of SEV features. + + **/ +STATIC +VOID +EFIAPI +InternalMemEncryptSevStatus ( + VOID + ) +{ + UINT32 RegEax; + MSR_SEV_STATUS_REGISTER Msr; + CPUID_MEMORY_ENCRYPTION_INFO_EAX Eax; + BOOLEAN ReadSevMsr; + UINT64 EncryptionMask; + + ReadSevMsr =3D FALSE; + + EncryptionMask =3D PcdGet64 (PcdPteMemoryEncryptionAddressOrMask); + if (EncryptionMask !=3D 0) { + // + // The MSR has been read before, so it is safe to read it again and av= oid + // having to validate the CPUID information. + // + ReadSevMsr =3D TRUE; + } else { + // + // Check if memory encryption leaf exist + // + AsmCpuid (CPUID_EXTENDED_FUNCTION, &RegEax, NULL, NULL, NULL); + if (RegEax >=3D CPUID_MEMORY_ENCRYPTION_INFO) { + // + // CPUID Fn8000_001F[EAX] Bit 1 (Sev supported) + // + AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, &Eax.Uint32, NULL, NULL, NUL= L); + + if (Eax.Bits.SevBit) { + ReadSevMsr =3D TRUE; + } + } + } + + if (ReadSevMsr) { + // + // Check MSR_0xC0010131 Bit 0 (Sev Enabled) + // + Msr.Uint32 =3D AsmReadMsr32 (MSR_SEV_STATUS); + if (Msr.Bits.SevBit) { + mSevStatus =3D TRUE; + } + + // + // Check MSR_0xC0010131 Bit 1 (Sev-Es Enabled) + // + if (Msr.Bits.SevEsBit) { + mSevEsStatus =3D TRUE; + } + } + + mSevStatusChecked =3D TRUE; +} + +/** + Returns a boolean to indicate whether SEV-ES is enabled. + + @retval TRUE SEV-ES is enabled + @retval FALSE SEV-ES is not enabled +**/ +BOOLEAN +EFIAPI +MemEncryptSevEsIsEnabled ( + VOID + ) +{ + if (!mSevStatusChecked) { + InternalMemEncryptSevStatus (); + } + + return mSevEsStatus; +} + +/** + Returns a boolean to indicate whether SEV is enabled. + + @retval TRUE SEV is enabled + @retval FALSE SEV is not enabled +**/ +BOOLEAN +EFIAPI +MemEncryptSevIsEnabled ( + VOID + ) +{ + if (!mSevStatusChecked) { + InternalMemEncryptSevStatus (); + } + + return mSevStatus; +} + +/** + Returns the SEV encryption mask. + + @return The SEV pagtable encryption mask +**/ +UINT64 +EFIAPI +MemEncryptSevGetEncryptionMask ( + VOID + ) +{ + if (!mSevEncryptionMaskSaved) { + mSevEncryptionMask =3D PcdGet64 (PcdPteMemoryEncryptionAddressOrMask); + mSevEncryptionMaskSaved =3D TRUE; + } + + return mSevEncryptionMask; +} diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/MemEncryptSevLibInternal.= c b/OvmfPkg/Library/BaseMemEncryptSevLib/MemEncryptSevLibInternal.c index 02b8eb225d81..b4a9f464e268 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/MemEncryptSevLibInternal.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/MemEncryptSevLibInternal.c @@ -2,7 +2,7 @@ =20 Secure Encrypted Virtualization (SEV) library helper function =20 - Copyright (c) 2017, AMD Incorporated. All rights reserved.
+ Copyright (c) 2017 - 2020, AMD Incorporated. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -12,102 +12,10 @@ #include #include #include -#include -#include -#include #include #include #include =20 -STATIC BOOLEAN mSevStatus =3D FALSE; -STATIC BOOLEAN mSevEsStatus =3D FALSE; -STATIC BOOLEAN mSevStatusChecked =3D FALSE; - -/** - Reads and sets the status of SEV features. - - **/ -STATIC -VOID -EFIAPI -InternalMemEncryptSevStatus ( - VOID - ) -{ - UINT32 RegEax; - MSR_SEV_STATUS_REGISTER Msr; - CPUID_MEMORY_ENCRYPTION_INFO_EAX Eax; - - // - // Check if memory encryption leaf exist - // - AsmCpuid (CPUID_EXTENDED_FUNCTION, &RegEax, NULL, NULL, NULL); - if (RegEax >=3D CPUID_MEMORY_ENCRYPTION_INFO) { - // - // CPUID Fn8000_001F[EAX] Bit 1 (Sev supported) - // - AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, &Eax.Uint32, NULL, NULL, NULL); - - if (Eax.Bits.SevBit) { - // - // Check MSR_0xC0010131 Bit 0 (Sev Enabled) - // - Msr.Uint32 =3D AsmReadMsr32 (MSR_SEV_STATUS); - if (Msr.Bits.SevBit) { - mSevStatus =3D TRUE; - } - - // - // Check MSR_0xC0010131 Bit 1 (Sev-Es Enabled) - // - if (Msr.Bits.SevEsBit) { - mSevEsStatus =3D TRUE; - } - } - } - - mSevStatusChecked =3D TRUE; -} - -/** - Returns a boolean to indicate whether SEV-ES is enabled. - - @retval TRUE SEV-ES is enabled - @retval FALSE SEV-ES is not enabled -**/ -BOOLEAN -EFIAPI -MemEncryptSevEsIsEnabled ( - VOID - ) -{ - if (!mSevStatusChecked) { - InternalMemEncryptSevStatus (); - } - - return mSevEsStatus; -} - -/** - Returns a boolean to indicate whether SEV is enabled. - - @retval TRUE SEV is enabled - @retval FALSE SEV is not enabled -**/ -BOOLEAN -EFIAPI -MemEncryptSevIsEnabled ( - VOID - ) -{ - if (!mSevStatusChecked) { - InternalMemEncryptSevStatus (); - } - - return mSevStatus; -} - - /** Locate the page range that covers the initial (pre-SMBASE-relocation) SM= RAM Save State Map. diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLibIntern= al.c b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLibInternal.c new file mode 100644 index 000000000000..e2fd109d120f --- /dev/null +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLibInternal.c @@ -0,0 +1,159 @@ +/** @file + + Secure Encrypted Virtualization (SEV) library helper function + + Copyright (c) 2020, AMD Incorporated. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include + +STATIC BOOLEAN mSevStatus =3D FALSE; +STATIC BOOLEAN mSevEsStatus =3D FALSE; +STATIC BOOLEAN mSevStatusChecked =3D FALSE; + +STATIC UINT64 mSevEncryptionMask =3D 0; +STATIC BOOLEAN mSevEncryptionMaskSaved =3D FALSE; + +/** + Reads and sets the status of SEV features. + + **/ +STATIC +VOID +EFIAPI +InternalMemEncryptSevStatus ( + VOID + ) +{ + UINT32 RegEax; + MSR_SEV_STATUS_REGISTER Msr; + CPUID_MEMORY_ENCRYPTION_INFO_EAX Eax; + BOOLEAN ReadSevMsr; + SEC_SEV_ES_WORK_AREA *SevEsWorkArea; + + ReadSevMsr =3D FALSE; + + SevEsWorkArea =3D (SEC_SEV_ES_WORK_AREA *) FixedPcdGet32 (PcdSevEsWorkAr= eaBase); + if (SevEsWorkArea !=3D NULL && SevEsWorkArea->EncryptionMask !=3D 0) { + // + // The MSR has been read before, so it is safe to read it again and av= oid + // having to validate the CPUID information. + // + ReadSevMsr =3D TRUE; + } else { + // + // Check if memory encryption leaf exist + // + AsmCpuid (CPUID_EXTENDED_FUNCTION, &RegEax, NULL, NULL, NULL); + if (RegEax >=3D CPUID_MEMORY_ENCRYPTION_INFO) { + // + // CPUID Fn8000_001F[EAX] Bit 1 (Sev supported) + // + AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, &Eax.Uint32, NULL, NULL, NUL= L); + + if (Eax.Bits.SevBit) { + ReadSevMsr =3D TRUE; + } + } + } + + if (ReadSevMsr) { + // + // Check MSR_0xC0010131 Bit 0 (Sev Enabled) + // + Msr.Uint32 =3D AsmReadMsr32 (MSR_SEV_STATUS); + if (Msr.Bits.SevBit) { + mSevStatus =3D TRUE; + } + + // + // Check MSR_0xC0010131 Bit 1 (Sev-Es Enabled) + // + if (Msr.Bits.SevEsBit) { + mSevEsStatus =3D TRUE; + } + } + + mSevStatusChecked =3D TRUE; +} + +/** + Returns a boolean to indicate whether SEV-ES is enabled. + + @retval TRUE SEV-ES is enabled + @retval FALSE SEV-ES is not enabled +**/ +BOOLEAN +EFIAPI +MemEncryptSevEsIsEnabled ( + VOID + ) +{ + if (!mSevStatusChecked) { + InternalMemEncryptSevStatus (); + } + + return mSevEsStatus; +} + +/** + Returns a boolean to indicate whether SEV is enabled. + + @retval TRUE SEV is enabled + @retval FALSE SEV is not enabled +**/ +BOOLEAN +EFIAPI +MemEncryptSevIsEnabled ( + VOID + ) +{ + if (!mSevStatusChecked) { + InternalMemEncryptSevStatus (); + } + + return mSevStatus; +} + +/** + Returns the SEV encryption mask. + + @return The SEV pagtable encryption mask +**/ +UINT64 +EFIAPI +MemEncryptSevGetEncryptionMask ( + VOID + ) +{ + if (!mSevEncryptionMaskSaved) { + SEC_SEV_ES_WORK_AREA *SevEsWorkArea; + + SevEsWorkArea =3D (SEC_SEV_ES_WORK_AREA *) FixedPcdGet32 (PcdSevEsWork= AreaBase); + if (SevEsWorkArea !=3D NULL) { + mSevEncryptionMask =3D SevEsWorkArea->EncryptionMask; + } else { + CPUID_MEMORY_ENCRYPTION_INFO_EBX Ebx; + + // + // CPUID Fn8000_001F[EBX] Bit 0:5 (memory encryption bit position) + // + AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, NULL, &Ebx.Uint32, NULL, NUL= L); + mSevEncryptionMask =3D LShiftU64 (1, Ebx.Bits.PtePosBits); + } + + mSevEncryptionMaskSaved =3D TRUE; + } + + return mSevEncryptionMask; +} --=20 2.30.0 -=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 (#69955): https://edk2.groups.io/g/devel/message/69955 Mute This Topic: https://groups.io/mt/79505900/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- From nobody Sat Apr 20 08:57:17 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+69956+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+69956+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 1610045422432754.5835321765343; Thu, 7 Jan 2021 10:50:22 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 5hx0YY1788612xRvmhLWfvcM; Thu, 07 Jan 2021 10:50:21 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.73]) by mx.groups.io with SMTP id smtpd.web12.1096.1610045421138467024 for ; Thu, 07 Jan 2021 10:50:21 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CP4n+n0VO6uPzNiofOTLDyBUY9dlNRgteckaP6vf9qCyn7Fhx8GHx+2XAW0KG9pGrMj8P0GhUcNxm4emJimgMVbPVZh0/IsBRthRVogNh7CSoRbCcwIX9FpxwHt8DbiI/ev1fmEtlr65o+6GEziKFnDNBGJrQ7KTYPWIhHOjpf4J73fG6E/VzY67jvpNm8AmfUmfce66n1BzDUEP7wZfBKwzddx25MHVzpOls5e5ngZ8r3oO4EE1/tUE8scmR3wgbk0UdT0A5Bzt8JVvMkzW2ktH88OTMdisMvpoCqFU3brCFLklFQXDabRmvO8g5E+ErFmKEaFp4ybFHaj6MwRwew== 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=6TNl7GQ3q3F7ERunQ1xkCM2mvqCoEn9b4IWnzPTXbkw=; b=WGOhHkH0F6ZeWGc8ZBuLNaTwWET06N2XvbBNvOYmtS0bIEqDT9vdYhZWJJKR00/df9L8dEHkbOgd0nWfuVIhOVkzjfugWVWaMy0d2Lc4iELQD/QYm5IpQ4M5Fv0gmKxdUCffS2MYHmKYSrVGihR5u1n7T3mbIeRE9b7ahT971IECk7+7reUuwcmYliWXhZzPjWE9Doq3Be6RExAs2v8qTJnT15OgpbFFmEvvkNsRbL+jywevglzFstY1cDUXZkNuN5D3Xfxm4AtAOyf2LcZWMV8qto6Sby82/FNOwbndZsPiZ82KmR9qbFRUmcAUOEfnx8bnbAm5oZmWYBNUe/MQgg== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:50:18 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:50:18 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel , Rebecca Cran , Peter Grehan , Anthony Perard , Julien Grall Subject: [edk2-devel] [PATCH v3 07/15] OvmfPkg: Obtain SEV encryption mask with the new MemEncryptSevLib API Date: Thu, 7 Jan 2021 12:48:17 -0600 Message-ID: <9de678c0d66443c6cc33e004a4cac0a0223c2ebc.1610045305.git.thomas.lendacky@amd.com> In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: DS7PR03CA0020.namprd03.prod.outlook.com (2603:10b6:5:3b8::25) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by DS7PR03CA0020.namprd03.prod.outlook.com (2603:10b6:5:3b8::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:50:17 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 925d49d7-00e2-4da0-ecc7-08d8b33d13ef X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8882; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: 0I5qvrh5O8KS5cEOzgYgSV3DG3F43CzWYwOPzibQTm9wrHEstxZ21DrKj3nSrPvQLnJNQyvwcQ84EgURPuGmyguf7vzVwtlJ1btiKm5D6sCbgktsrHAOKK1sIi2N+uI2YZFb0X/QrgTrbZCMBwuk2InBCxklNmS79p57PNsuI3SWCye9YkgL55XrHerW+iEWdHqfx6i5GxwyIyapSvg0FD5DJqxuaOTct2/3HaVv1pHQJruxbKJmDzL8WQ83lADXOQX8UPRwA4+bgxd9Kg2J81oFN1LW+zVXdnddKGqMdEdTiTlovJjTqo77CBLGVIhAPdF1CR10PwuepdVzKOO8g+eYOfiGFijIuOQXqDGQqPpMqB6GoqXKjR8aRY1Zc0Uur0PyEoQtB7EatLs7ghRy04IBiH2YxAxXLsDrsUkqenzLP8CEwgu5NzFbwG1mFZpVglUcjbpJMpvWM0Wq40UQeQ== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?Xb3rjdOrrQ/ioQ4+Bwz0dVLjGCih/AygKcxvEBNfXqpz0TeTF9iyzJy6xk8+?= =?us-ascii?Q?/A1B9jlDIW1+029UjZdiZ3viwhddLfLemI7U2V/6zcPu0HKqJedH7dnlN1sE?= =?us-ascii?Q?PrKHqjOZp4kKVGGqhRlKms6vVxwiZLSnvFudcm/DSV3oAsmWfGH24tAstsWR?= =?us-ascii?Q?IZMdTV84NA5l/74dLSak2PK3iaOgkphTWgRMZ73h66DSRq7kkSAGVrEbzRwz?= =?us-ascii?Q?4PGB1viPdKJBmPvUlFtE8/GwRM2NrywYgH4EZN68tAPjrzxncH+a5e24+71N?= =?us-ascii?Q?DKGfD6qiJ+224W20NP/m/L1maH+GoLV/vcBCbLpnyuThYgaIpTPedZTBy3p2?= =?us-ascii?Q?xllYt7N3M4Z+Iqw4ZifRGrVJ2FGEh6op64UV6ag7Ouh1uA/aPYQFEhsrERsS?= =?us-ascii?Q?T9uedByfdszdk1bG9ddboX/KffcgswPBq5R3rPHKkAwgAq35E+jXD549BBt4?= =?us-ascii?Q?in07H+ENbmKGM/ouPHvcSJkGLQn0pfZXsRg5zTmUuEH51c3OPWDMkS4jT85u?= =?us-ascii?Q?7alqd1Ie2v/O8RfxbCjPEk11+7h3gaUPTGg8M1edgsSb3UPrWs5Iba1vukdH?= =?us-ascii?Q?mRfukAyFUEjbxTY9ZT2e6Py8ozG51O8UzPbK6RzgsjhaFwAZvnOWxXCznO3d?= =?us-ascii?Q?MwOrVIAcQNE5R95clsJZQJ7+bjy3WHnJTU06GuClyYvc5hR7SIn/9NWgIvTz?= =?us-ascii?Q?2J/wCk+D4CIOjugqW36VtcIJTbn+4fw2hvjOWJHL0qRoRl2XEi3MyQve1CbZ?= =?us-ascii?Q?phv+5E8BBCf9p4PrFqNrGe3dQ/gdsnr3OW8ae/wMQdmmzdoJH1YZIWOK/ToS?= =?us-ascii?Q?1C38gO3RiIO/mbL0EWn+uJDwkyR9W3Gis003UBLC1q6X1ud5ACJ3n1zr+eNJ?= =?us-ascii?Q?XeAVZ5H9xtZiU9n0N6nx77XJfISMT+xTkgRp/5J0g9fyhVR2XdRzcIxgpAqz?= =?us-ascii?Q?+/Ux0NmdUoQdi8n5x+EatEUc2dwQLh3JVUelzhgXyEtDTt2d29i1AL0F/CeK?= =?us-ascii?Q?LOZE?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:50:18.1293 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: 925d49d7-00e2-4da0-ecc7-08d8b33d13ef X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: oDRvcI1YdT3zyDUp5KOQ6uX+OTFdsbW5N0K+Xdw3lZo8qFqNlgDA5JT3LSZVAI1y3ffKG4exw3XZemHXcJNKxg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: pCcTfrbMKcS0GQAEvYE3a3Oqx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045421; bh=U2vXnbrvbn6kG7pG/E6lZ13fI4tdrKo0ScZY9D9hDLA=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=Kb8EZIA/xCzbkpxPx7aMpUFjY7mOeDScTqBZM34zFW8nsqVg8/2XeVooTe6mDFbCj7I pZ1Gc8SI34jjUlOnkxyz6O0vvo12mtJ69umgt+/XLt+d9LKxDgDikc160c0zM5Be2BAH0 f1xa+nOOvbdpnuqafeDVFth99XTQEmyT5CE= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 The early assembler code performs validation for some of the SEV-related information, specifically the encryption bit position. The new MemEncryptSevGetEncryptionMask() interface provides access to this validated value. To ensure that we always use a validated encryption mask for an SEV-ES guest, update all locations that use CPUID to calculate the encryption mask to use the new interface. Also, clean up some call areas where extra masking was being performed and where a function call was being used instead of the local variable that was just set using the function. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Rebecca Cran Cc: Peter Grehan Cc: Brijesh Singh Cc: Anthony Perard Cc: Julien Grall Reviewed-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/Bhyve/PlatformPei/AmdSev.c | 12 ++---------- OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c | 15 +++++-------= --- OvmfPkg/PlatformPei/AmdSev.c | 12 ++---------- OvmfPkg/XenPlatformPei/AmdSev.c | 12 ++---------- 4 files changed, 11 insertions(+), 40 deletions(-) diff --git a/OvmfPkg/Bhyve/PlatformPei/AmdSev.c b/OvmfPkg/Bhyve/PlatformPei= /AmdSev.c index e484f4b311fe..e3ed78581c1b 100644 --- a/OvmfPkg/Bhyve/PlatformPei/AmdSev.c +++ b/OvmfPkg/Bhyve/PlatformPei/AmdSev.c @@ -1,7 +1,7 @@ /**@file Initialize Secure Encrypted Virtualization (SEV) support =20 - Copyright (c) 2017, Advanced Micro Devices. All rights reserved.
+ Copyright (c) 2017 - 2020, Advanced Micro Devices. All rights reserved.<= BR> =20 SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -15,8 +15,6 @@ #include #include #include -#include -#include #include =20 #include "Platform.h" @@ -32,7 +30,6 @@ AmdSevInitialize ( VOID ) { - CPUID_MEMORY_ENCRYPTION_INFO_EBX Ebx; UINT64 EncryptionMask; RETURN_STATUS PcdStatus; =20 @@ -43,15 +40,10 @@ AmdSevInitialize ( return; } =20 - // - // CPUID Fn8000_001F[EBX] Bit 0:5 (memory encryption bit position) - // - AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, NULL, &Ebx.Uint32, NULL, NULL); - EncryptionMask =3D LShiftU64 (1, Ebx.Bits.PtePosBits); - // // Set Memory Encryption Mask PCD // + EncryptionMask =3D MemEncryptSevGetEncryptionMask (); PcdStatus =3D PcdSet64S (PcdPteMemoryEncryptionAddressOrMask, Encryption= Mask); ASSERT_RETURN_ERROR (PcdStatus); =20 diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c b/Ovm= fPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c index 5e110c84ff81..6422bc53bd5d 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c @@ -3,7 +3,7 @@ Virtual Memory Management Services to set or clear the memory encryption= bit =20 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
- Copyright (c) 2017, AMD Incorporated. All rights reserved.
+ Copyright (c) 2017 - 2020, AMD Incorporated. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -12,6 +12,7 @@ **/ =20 #include +#include #include #include =20 @@ -39,17 +40,12 @@ GetMemEncryptionAddressMask ( ) { UINT64 EncryptionMask; - CPUID_MEMORY_ENCRYPTION_INFO_EBX Ebx; =20 if (mAddressEncMaskChecked) { return mAddressEncMask; } =20 - // - // CPUID Fn8000_001F[EBX] Bit 0:5 (memory encryption bit position) - // - AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, NULL, &Ebx.Uint32, NULL, NULL); - EncryptionMask =3D LShiftU64 (1, Ebx.Bits.PtePosBits); + EncryptionMask =3D MemEncryptSevGetEncryptionMask (); =20 mAddressEncMask =3D EncryptionMask & PAGING_1G_ADDRESS_MASK_64; mAddressEncMaskChecked =3D TRUE; @@ -289,8 +285,7 @@ SetPageTablePoolReadOnly ( LevelSize[3] =3D SIZE_1GB; LevelSize[4] =3D SIZE_512GB; =20 - AddressEncMask =3D GetMemEncryptionAddressMask() & - PAGING_1G_ADDRESS_MASK_64; + AddressEncMask =3D GetMemEncryptionAddressMask(); PageTable =3D (UINT64 *)(UINTN)PageTableBase; PoolUnitSize =3D PAGE_TABLE_POOL_UNIT_SIZE; =20 @@ -437,7 +432,7 @@ Split1GPageTo2M ( =20 AddressEncMask =3D GetMemEncryptionAddressMask (); ASSERT (PageDirectoryEntry !=3D NULL); - ASSERT (*PageEntry1G & GetMemEncryptionAddressMask ()); + ASSERT (*PageEntry1G & AddressEncMask); // // Fill in 1G page entry. // diff --git a/OvmfPkg/PlatformPei/AmdSev.c b/OvmfPkg/PlatformPei/AmdSev.c index 4a515a484720..954d53eba4e8 100644 --- a/OvmfPkg/PlatformPei/AmdSev.c +++ b/OvmfPkg/PlatformPei/AmdSev.c @@ -1,7 +1,7 @@ /**@file Initialize Secure Encrypted Virtualization (SEV) support =20 - Copyright (c) 2017, Advanced Micro Devices. All rights reserved.
+ Copyright (c) 2017 - 2020, Advanced Micro Devices. All rights reserved.<= BR> =20 SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -17,9 +17,7 @@ #include #include #include -#include #include -#include #include =20 #include "Platform.h" @@ -116,7 +114,6 @@ AmdSevInitialize ( VOID ) { - CPUID_MEMORY_ENCRYPTION_INFO_EBX Ebx; UINT64 EncryptionMask; RETURN_STATUS PcdStatus; =20 @@ -127,15 +124,10 @@ AmdSevInitialize ( return; } =20 - // - // CPUID Fn8000_001F[EBX] Bit 0:5 (memory encryption bit position) - // - AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, NULL, &Ebx.Uint32, NULL, NULL); - EncryptionMask =3D LShiftU64 (1, Ebx.Bits.PtePosBits); - // // Set Memory Encryption Mask PCD // + EncryptionMask =3D MemEncryptSevGetEncryptionMask (); PcdStatus =3D PcdSet64S (PcdPteMemoryEncryptionAddressOrMask, Encryption= Mask); ASSERT_RETURN_ERROR (PcdStatus); =20 diff --git a/OvmfPkg/XenPlatformPei/AmdSev.c b/OvmfPkg/XenPlatformPei/AmdSe= v.c index 7ebbb5cc1fd2..4ed448632ae2 100644 --- a/OvmfPkg/XenPlatformPei/AmdSev.c +++ b/OvmfPkg/XenPlatformPei/AmdSev.c @@ -1,7 +1,7 @@ /**@file Initialize Secure Encrypted Virtualization (SEV) support =20 - Copyright (c) 2017, Advanced Micro Devices. All rights reserved.
+ Copyright (c) 2017 - 2020, Advanced Micro Devices. All rights reserved.<= BR> Copyright (c) 2019, Citrix Systems, Inc. =20 SPDX-License-Identifier: BSD-2-Clause-Patent @@ -14,8 +14,6 @@ #include #include #include -#include -#include =20 #include "Platform.h" =20 @@ -30,7 +28,6 @@ AmdSevInitialize ( VOID ) { - CPUID_MEMORY_ENCRYPTION_INFO_EBX Ebx; UINT64 EncryptionMask; RETURN_STATUS PcdStatus; =20 @@ -41,15 +38,10 @@ AmdSevInitialize ( return; } =20 - // - // CPUID Fn8000_001F[EBX] Bit 0:5 (memory encryption bit position) - // - AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, NULL, &Ebx.Uint32, NULL, NULL); - EncryptionMask =3D LShiftU64 (1, Ebx.Bits.PtePosBits); - // // Set Memory Encryption Mask PCD // + EncryptionMask =3D MemEncryptSevGetEncryptionMask (); PcdStatus =3D PcdSet64S (PcdPteMemoryEncryptionAddressOrMask, Encryption= Mask); ASSERT_RETURN_ERROR (PcdStatus); =20 --=20 2.30.0 -=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 (#69956): https://edk2.groups.io/g/devel/message/69956 Mute This Topic: https://groups.io/mt/79505902/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- From nobody Sat Apr 20 08:57:17 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+69957+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+69957+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 1610045430772532.6647513661732; Thu, 7 Jan 2021 10:50:30 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id B6UDYY1788612xjLPBuhIpDG; Thu, 07 Jan 2021 10:50:30 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.81]) by mx.groups.io with SMTP id smtpd.web09.1120.1610045429763352142 for ; Thu, 07 Jan 2021 10:50:29 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VARTUmwWSU7no65x7QqNwUzHYcSHrM8LCHVU5zRhNfXvXLVyBdI6Qa3mpLQnjrO1M0gk/Qw+3SDKQkju2DnoIxO2lPoYdNvhOs5hFn0yC12CVuto8WpZfnahehCTmwzK3MYzF3zx8YuZtoaLmpzYPvcZOmh98g1c68xxudneEVSt/JO6YuFnenhCbcla6Te6hKwbMd4zOSdluMkq6slppInvMTAN8p21wEY0HyqSM6PDlD+GQ55z+vvLcmwMUVJMhp7kzrnZo3qx1Dm/DEKVM8HOam8l0LY4raHH7lgvBNY33md522GgS3aXfnyl+XHku+oajUL3F0sbznovsiLW+g== 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=xrWe/lVlufpffDCm+3yDZdIMpp8lRR1l0HrvZ/IqIgI=; b=B/ODq7qIi4AU16VcdlmPjgeOWnJbvS2xOgCrhX1gtu7+Uf0RekE3phxuKY+wIUzYnZOteEXrp0DPQ26DEaBj7kBWQzEiHhHe32ThQuY84mG4SHoMkSyqnCAPCQMTOm+LW2buWkW9Ujz5giVfSWEEHJINhtuJu5hoMsH+sYYls1KruC5ZvZuO0AItlY+/Qg5EVp2jNVBEkuojmDrT28+5eDAghIopFKaDIB0CP5JHVWiLbzF3rTvMlxueSTc+ps/r42PvYouW032wGZPELlik74e+2czf8ioUJp132E2vbGr+DzcJxZbHQuQpNueQszull0X+LANVUXm7a63CJImFVQ== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:50:26 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:50:26 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [edk2-devel] [PATCH v3 08/15] OvmfPkg/AmdSevDxe: Clear encryption bit on PCIe MMCONFIG range Date: Thu, 7 Jan 2021 12:48:18 -0600 Message-ID: <711ae2dcb6cb29e4c60862c18330cff627269b81.1610045305.git.thomas.lendacky@amd.com> In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: DM6PR02CA0110.namprd02.prod.outlook.com (2603:10b6:5:1b4::12) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by DM6PR02CA0110.namprd02.prod.outlook.com (2603:10b6:5:1b4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:50:26 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 80b53530-94d9-4251-9667-08d8b33d18f6 X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:9508; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: JjsQpM8wUO+bfSMRKqm/Bdz0XCJhHn+2bT9BNhkuxnrTkroBWuCnUYVdEJYKZC1IOgk9bIR6+NMrZRZVyZzqZHUOUsLz9Sg1sRgqlFZSi4QxWn9iS1rP5/kzCjQFxEswE3gptUnWNtmp1DHf6/wATQjJxKUDYGJ+qGU1gYrEJTwZVUsrLfFNFj2ym49eEfdFSxZC/ZHV6X7sqx+7Cm+gpfy+8SrSke4JDSQjSuMCczfov3oDV6sd1gmn7tCAr4VMX9lbQZB7FJJpIZrsdODsKxhgy1nFHLNtONfpc2Ab0zUOKgZIiksXRP5UEXLavF6hGdUCLYK8vMlYsU1GD36Nno/tNnUNP37Eau6KMnfuM+MgUiAU3PMsWXst6A9j4zaOxtvjE7bs9+B4oQhDPPTGk89xHli9nvxpcoOPIUQqb/9KLz2Mx6aoQ0ZGEhGt3KYTToy9xq8iZmgxD4ye0+gg4Q== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?EOY7xUD5xCalPisl6KRbkAcbd5v7yCPG/UIErK9208SV3QNxcqyeVsGt9AVG?= =?us-ascii?Q?YYy6teLVOv23MK54GOR39KaFzBuOyqMZcPIZb4GUzD8qGI+x+6YBxXN5Vva4?= =?us-ascii?Q?RB7RVaqOwUsGsIiyLjtuxThp6oXfyHC6GiSaega6B5+beMHLkYYWd3B+zakE?= =?us-ascii?Q?0EFK1pKsQLa7ytFkBrThbdXXkdKsUWegO/YNOQoi1x51sBOEUwqsgxoTvLN+?= =?us-ascii?Q?Hz/KMHA4C7WJFUSSLDqnKj+foukz4Tr6V/SdptoxDDGwKYjUcFLEq8AQqwht?= =?us-ascii?Q?QiyiJwqkpyok7mifwvdcQIUZckvoN9FRpHLgVib4UKuPpQ1L/NutrfUkIwTc?= =?us-ascii?Q?uTEHjm9kR/R1sarmNTKPQmbP6qc+TqzFZC9IDS7i5kWu+QISa/+hBrNDjy0E?= =?us-ascii?Q?w4ll3xD1t2LAZp5PrS9xDyvlfAXzcIGc0plCr+C94ME+QEChSbAsEZyjge8n?= =?us-ascii?Q?+Eg8G0rGVhvjTWRBhu9qUkbMrtORzgHABIhhWs4+Nuq+1HiKyLahRKNDK/+S?= =?us-ascii?Q?aR0r/uQ0SwO/KXALLBIDEvICzUNpw2skVQ8GhBAGwwRB8xTVUBFCPKw7Xu0q?= =?us-ascii?Q?Kj5ho20xiF1XGF/Gv3Zv/6gQIjPoIqZmsGz+x8PT4ioOix0K/H2kzF3kYSC0?= =?us-ascii?Q?lXOqulvTkE6pku/I36TB6MgsQ/vfzBpk21tMuO1vVqjRYgJCec+GVgoGNSva?= =?us-ascii?Q?7TXRg2AoUetEpUrMZDie5SYXBMhQUb+NFfZeQ3MUxHSLHIpPHWL7K7EmAppV?= =?us-ascii?Q?084SdPFP9J4m31uNYDDVmu2gEV+zriGKxQvdHq+462+1BGJxOkpJ54LFL8m+?= =?us-ascii?Q?f6NuJKMy6+H44gC9V8ckhn+gtSjEIDFiTw1aEmBlj+Ibh76T6fihph7hO7qe?= =?us-ascii?Q?jNjX7jWhFLS7UcQ8QA3LZNklycyzMw/H8S9yE+fOoJ/AXQ/badZOPNs+g1Sd?= =?us-ascii?Q?pMzWOtdvOcKAo+SlLMPoH4lLiu/jnxvOaVj9qBJDKcC3UPE58pKwHfmifn+q?= =?us-ascii?Q?XAf0?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:50:26.5765 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: 80b53530-94d9-4251-9667-08d8b33d18f6 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: mbU0JeBP6Y3fwl29l+BHIVWltIk6H3Ge8YA6m+Dj1sMNzJxKXgONGZ46u++VLDMGYBLQIgj9GCN7PixzXLB50w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: eUmmpO1ByKKmZo9gGx4yr3gKx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045430; bh=nco+pqrYu17fpbC4rdf0FpJ7Lmb9Sbxt2+5SVpuoz6s=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=RZQaKsUZuoLMaE4hXUoexpmNatSg4NIfnG+mby1dg+y1ZdJxfcUPkHyuJn4ivd/+Ymu 80g/KvtP027bq12erGK4QSiMLjZjHu4rJ8Bmu+NNHJp1gKmVLbWglhW9hqCTYdB0bTCvr XBba3xdeMPTMY2KX7jt2i0+UXCMRn5dJd+Q= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 The PCIe MMCONFIG range should be treated as an MMIO range. However, there is a comment in the code explaining why AddIoMemoryBaseSizeHob() is not called. The AmdSevDxe walks the GCD map looking for MemoryMappedIo or NonExistent type memory and will clear the encryption bit for these ranges. Since the MMCONFIG range does not have one of these types, the encryption bit is not cleared for this range. Add support to detect the presence of the MMCONFIG range and clear the encryption bit. This will be needed for follow-on support that will validate that MMIO is not being performed to an encrypted address range under SEV-ES. Even though the encryption bit was set for this range, this still worked under both SEV and SEV-ES because the address range is marked by the hypervisor as MMIO in the nested page tables: - For SEV, access to this address range triggers a nested page fault (NPF) and the hardware supplies the guest physical address (GPA) in the VMCB's EXITINFO2 field as part of the exit information. However, the encryption bit is not set in the GPA, so the hypervisor can process the request without any issues. - For SEV-ES, access to this address range triggers a #VC. Since OVMF runs identity mapped (VA =3D=3D PA), the virtual address is used to avoid the lookup of the physical address. The virtual address does not have the encryption bit set, so the hypervisor can process the request without any issues. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Brijesh Singh Reviewed-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/AmdSevDxe/AmdSevDxe.inf | 8 +++++++- OvmfPkg/AmdSevDxe/AmdSevDxe.c | 20 +++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/OvmfPkg/AmdSevDxe/AmdSevDxe.inf b/OvmfPkg/AmdSevDxe/AmdSevDxe.= inf index dd9ecc789a20..0676fcc5b6a4 100644 --- a/OvmfPkg/AmdSevDxe/AmdSevDxe.inf +++ b/OvmfPkg/AmdSevDxe/AmdSevDxe.inf @@ -2,7 +2,7 @@ # # Driver clears the encryption attribute from MMIO regions when SEV is en= abled # -# Copyright (c) 2017, AMD Inc. All rights reserved.
+# Copyright (c) 2017 - 2020, AMD Inc. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -39,3 +39,9 @@ [Depex] =20 [FeaturePcd] gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire + +[FixedPcd] + gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress + +[Pcd] + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId diff --git a/OvmfPkg/AmdSevDxe/AmdSevDxe.c b/OvmfPkg/AmdSevDxe/AmdSevDxe.c index 595586617882..689bfb376d03 100644 --- a/OvmfPkg/AmdSevDxe/AmdSevDxe.c +++ b/OvmfPkg/AmdSevDxe/AmdSevDxe.c @@ -4,12 +4,13 @@ in APRIORI. It clears C-bit from MMIO and NonExistent Memory space when = SEV is enabled. =20 - Copyright (c) 2017, AMD Inc. All rights reserved.
+ Copyright (c) 2017 - 2020, AMD Inc. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ =20 +#include #include #include #include @@ -65,6 +66,23 @@ AmdSevDxeEntryPoint ( FreePool (AllDescMap); } =20 + // + // If PCI Express is enabled, the MMCONFIG area has been reserved, rather + // than marked as MMIO, and so the C-bit won't be cleared by the above w= alk + // through the GCD map. Check for the MMCONFIG area and clear the C-bit = for + // the range. + // + if (PcdGet16 (PcdOvmfHostBridgePciDevId) =3D=3D INTEL_Q35_MCH_DEVICE_ID)= { + Status =3D MemEncryptSevClearPageEncMask ( + 0, + FixedPcdGet64 (PcdPciExpressBaseAddress), + EFI_SIZE_TO_PAGES (SIZE_256MB), + FALSE + ); + + ASSERT_EFI_ERROR (Status); + } + // // When SMM is enabled, clear the C-bit from SMM Saved State Area // --=20 2.30.0 -=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 (#69957): https://edk2.groups.io/g/devel/message/69957 Mute This Topic: https://groups.io/mt/79505909/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- From nobody Sat Apr 20 08:57:17 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+69958+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+69958+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 1610045439007293.8559096790909; Thu, 7 Jan 2021 10:50:39 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id otPfYY1788612xMqik4jcOiD; Thu, 07 Jan 2021 10:50:38 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.61]) by mx.groups.io with SMTP id smtpd.web10.1142.1610045437581597826 for ; Thu, 07 Jan 2021 10:50:37 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hDgE93REs6BK4oCS0+uX19X34c3CRywPoRbvNuLpTYnuLRhW7ZkNmH8g7rcfzpc1uQGyB+SQIotoup877ReGkZ3tQt68EWTLJdI4PvN0dNNDWteoiJCMitvHGRdjv29RFoBo7LEKBWeEzEUUKqQ2/DoBkSmWhQW/FZP2Df5J7Oznq6DO9jwuOyMAJLD6I7ok7D6XlkT66cH4isdP114ssQUab8f6t9pYDB0MlWViCJyHnFQkqRGk2wx04LxchNct+UtRmH+xT+CuEEOc1ZkyXnh+ffmYdEbwgQWDjeBFIf5XdLxJBuP161cAzZ5OK0AlLWm9Voj1duhewFElsiD9bg== 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=8kFpyzoO8wbsDOFAoVQRLo3+seYYNZM3lE1pSLkD3+8=; b=dqAaZLAQZGLaTYJu3Dnunv5dEVrPD5E4ae2V8QyjzxX4qedQKCBZMcn50pUZePzFxUd+l4SUZbiy7CjgieEWG/qKz8BT9NfzRk8xrEQJ9qNQxxgDyNOfmF7pAMrRjKJPeuMPJBNvP7WMwAPsFpVg31yXb9u1GV1/g7aWSTJojshmS5pTpCCYowMVvydUSa6e6LLWKikXD5ChUXUmMVh5T2Ot/9Q44pVZrkMjo1MijvNxe2N6+xnSjFxgSeoTVWbvMD0IvFq0Rdzl8VppvgS/n0+A76+pyNFQU+qcjQZi0aVCFEUTFhiskq97Km5qQCUzy8VppUVIv2DWX3bYFxsX3Q== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:50:34 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:50:34 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [edk2-devel] [PATCH v3 09/15] OvmfPkg/VmgExitLib: Check for an explicit DR7 cached value Date: Thu, 7 Jan 2021 12:48:19 -0600 Message-ID: <65157c1155a9c058c43678400dfc0b486e327a3e.1610045305.git.thomas.lendacky@amd.com> In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: DM5PR05CA0012.namprd05.prod.outlook.com (2603:10b6:3:d4::22) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by DM5PR05CA0012.namprd05.prod.outlook.com (2603:10b6:3:d4::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3763.2 via Frontend Transport; Thu, 7 Jan 2021 18:50:33 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 6e9ab722-4cda-45df-c1fd-08d8b33d1d8d X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:5797; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: pvud6hZFtcLZQyylol7mncp9fa1mRa6jmTzbNovRWIFnYjB0KwP3Jf+xhfa7udElGjIMeEs31WUJ/YGBbt/F6bbd6fQqfDSI5lykC51AilO0wX515wOcDaUkNrTleDwXUNSDaySD/9VFU1IxFXTuuZ8V1ogiMGMp6rBEMfyFTz5ox9C8o76a9sr4/sj8NK3vSDT8nmsw/jP97WTma5VfcO2RdupxLCINDWBrR4+h3pE6QUaD0R5d/Vezh+6arKjR0kIWdO+nJp1UslB2Ak+aeCr9kfIsrbzauF9xTBdat1nD8StWRN4/WOBikX2zqrK6vFXkPQnN1eNlpeMi7wxtIezSzmHgqnDMRyEmKPOXBLpQrp4XwRwh4S41o7ymKc833/pTnrIVQDWqp9PdB0RrXRYcEnx0df3bxl/BqRRWqgNcnOhZ2EPuNmj05a9rLTJVLjH5FosQOTtidKhqtF095Q== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?Tbj1/JobasbsLs5S8/dOS3SXX795UG1QzQnziX7b5OslrXaQxJLPv4dAx7BQ?= =?us-ascii?Q?7Qwiam7ucy6gm4GSsoxSf0XcaE1abdgmy0JFLT0uDKAUjrM812Ms8aaXyl7i?= =?us-ascii?Q?ecQJPjPXZzv5//9OtwVcYX2OYsEk5rHDJuCcn0gSQgZuYaC4CJnDgMcke48o?= =?us-ascii?Q?Pes3EITiToiOWhgrvC4NuG56HfknrhspQT2O9Oo0crK/UAOOc3k0NMB4iJjz?= =?us-ascii?Q?Vl2OrNlncTnBtxHkTAfEwmPeHctjI6dI6GfXypUGo3e1L9qzBjf7kkD3RZ7I?= =?us-ascii?Q?ZkUr6P5lPXWG+saOMXXY7JNc/MZ/Tliib4y/CnIciSXUTWIQrc6qgfRaH9Ve?= =?us-ascii?Q?8FHKbAq80C4TBbb/XtNcfPkYuSLWwryiKUeDkOiP7ZITm3duA5eAPzenx9bO?= =?us-ascii?Q?+GvLRb34SW99IXqiOYsj2AD5I02CegGbeXDjcHc+oXVViZTgYhhVJhuaOovJ?= =?us-ascii?Q?L+x3jsmwRL+jWAg7oRLl3S8FMWdnQoL0N6tl2RTU6hn7CSbgAWqQ5PWaGyGA?= =?us-ascii?Q?RApSeg3RQgl+kwdsxVGnMNJXp4UfQb16tY/MsynxbGCdz4IIiE0fivBkdUFE?= =?us-ascii?Q?ZdAnXx35/BGBGpmonrAeqHlDGaA05PVRaYas8F8rjEPsHjXUhH1UlRsLQ9OA?= =?us-ascii?Q?7/pzkWcqPKK30bkVN74yIoyXR8HQxu8bo3doglxAkTk6e2dGx0bXRDwgke/a?= =?us-ascii?Q?t5jU4VARqRhVn2D7IouYDam3d6HC67x7WYV8X18FaVJ3hFbOioGPTsIjL5cy?= =?us-ascii?Q?V4R2PvapTcqiVzrfe8rtOnK05nAIqcclvYa/jYL9joIZt0RqGPA91NPc1T+S?= =?us-ascii?Q?B6jT2GBJG1Khpy6fd0d9ND9V3Esa+eVW9vYXx1VtckR2X5wIsgJOq1Bjmc8a?= =?us-ascii?Q?LkEbZuLmQ6jZQ9yvCJdz+QkjeZ25l8gpmfZSNDwIlUFGj+5GfgkX1O+ANXX5?= =?us-ascii?Q?e2kDRQfcBcqgv+4R2aMXuK16yMKuWxiBIrh7mJYI3/BYf2IPrggPGZuaeXlr?= =?us-ascii?Q?Drmh?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:50:34.2591 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: 6e9ab722-4cda-45df-c1fd-08d8b33d1d8d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: P39UDS+O9MpDBUUSGkzZsySwHMQXuII4IV0VT7DQI4BHFjwHgrg5hIqHB+L71xKguw+Pcjju9kRSHW7d3GUE9A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: Geq6ktlP5CQLNrsIZ3CgQOuDx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045438; bh=ynbG5veG20zLsKpMgjl1b4njBYrPdXk8NG3bKCQR1dI=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=ROMooaLGDYbTAzm+7RPgvRcWgQ8LWyNMHBBv3VTbVjV0E+NXzQ14w+E+Ro1nUe9JPXR 2Oc031LOCW0BPFOMlth0W3DRj/J0J/7yHfv709tfBzSYSXX+Xs7VdMq/Ba4OK10kuX+Xv JDeGlzsQ5eBdbp9b5Mp0VTa/Vwqe3VaZOik= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 Check the DR7 cached indicator against a specific value. This makes it harder for a hypervisor to just write random data into that field in an attempt to use an invalid DR7 value. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Brijesh Singh Reviewed-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c b/OvmfPkg/Librar= y/VmgExitLib/VmgExitVcHandler.c index 1671db3a01b1..5149ab2bc989 100644 --- a/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c +++ b/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c @@ -128,10 +128,13 @@ UINT64 =20 // // Per-CPU data mapping structure +// Use UINT32 for cached indicators and compare to a specific value +// so that the hypervisor can't indicate a value is cached by just +// writing random data to that area. // typedef struct { - BOOLEAN Dr7Cached; - UINT64 Dr7; + UINT32 Dr7Cached; + UINT64 Dr7; } SEV_ES_PER_CPU_DATA; =20 =20 @@ -1489,7 +1492,7 @@ Dr7WriteExit ( } =20 SevEsData->Dr7 =3D *Register; - SevEsData->Dr7Cached =3D TRUE; + SevEsData->Dr7Cached =3D 1; =20 return 0; } @@ -1533,7 +1536,7 @@ Dr7ReadExit ( // If there is a cached valued for DR7, return that. Otherwise return the // DR7 standard reset value of 0x400 (no debug breakpoints set). // - *Register =3D (SevEsData->Dr7Cached) ? SevEsData->Dr7 : 0x400; + *Register =3D (SevEsData->Dr7Cached =3D=3D 1) ? SevEsData->Dr7 : 0x400; =20 return 0; } --=20 2.30.0 -=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 (#69958): https://edk2.groups.io/g/devel/message/69958 Mute This Topic: https://groups.io/mt/79505915/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- From nobody Sat Apr 20 08:57:17 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+69959+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+69959+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 1610045445639180.65822856335478; Thu, 7 Jan 2021 10:50:45 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 5n4AYY1788612xkfwBmb2QKk; Thu, 07 Jan 2021 10:50:45 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.57]) by mx.groups.io with SMTP id smtpd.web09.1126.1610045444332981723 for ; Thu, 07 Jan 2021 10:50:44 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kp6GLJslJCRnY1jvBN2rXXy4e7cmeSRlii+KJnSKNal7Oyuuxi8t8M7X9Lh47XGWOGkKjNBcGcDRwee3WSWFNUfcqIj9dsDpfjx1aAsvS4Rh+i7WnqTpXOufWHeiWwDTWdWqEzFlcAAD4l18QU19g5WBZSd6xboYD7//FmmQYZ+peOcn0WqWei7EgjqUbPg0kZFJcex0uyUEE0tX3fa8GIUyaNUjciS1FvT0AYItRKBjMgbwJ2HDm6ISI62wKsqOy0R0OK76JgRZBIGyf+qrzjbgcw93Wd5WHnzCUBuBJFU2n5hrDw7/uR33b6XRrazObnAydmIEMGFV7u5OoSzU+w== 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=Ugtntkxt/aCn/yf/5yWWciE7OXtW9UJfKij4gb8J/r0=; b=gVwk61Mm/rf77rRr23W8Q40GvH7XaBjh+SrantTLyVRznOL2LbQQ8VSVYzW1g088aPpnW3QjRQvdMXJPrtKjPKczjQjPEqM2iifp8RsUL7hv9iB5BhRsAHaXWw6O1MpJKzbpqJxmHH0O6RQ1hkdopJSnKKRx2/8lk9DtSMrAK/C2TQhM0GAY9DSmUJI80gtpfgJLqzCsbMQCfakBzEoc00FM/9Rw57YqayPvhqicUgEU8+EhJ+ZseO+9Csp4fD1eBUm6FwVCqzNYgdc3oUHcvnqElqtONFXqHsYDrMkn5BW5YaHSwP3tAixuQDdAWrrJUlGXb8iY08dglQQkaWUevQ== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:50:42 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:50:42 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [edk2-devel] [PATCH v3 10/15] OvmfPkg/MemEncryptSevLib: Coding style fixes in prep for SEC library Date: Thu, 7 Jan 2021 12:48:20 -0600 Message-ID: In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: DM6PR13CA0047.namprd13.prod.outlook.com (2603:10b6:5:134::24) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by DM6PR13CA0047.namprd13.prod.outlook.com (2603:10b6:5:134::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3763.2 via Frontend Transport; Thu, 7 Jan 2021 18:50:41 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: ec7d6c0f-39ae-469e-14a9-08d8b33d2225 X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8882; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: kleK9agcI9hJpgKt2k/Gru0DS8odO8Xewm1DUBpitk1I+LxD+KEXvMjobk0Iokx7hMbIZHy4Sjxs026MSmwG1veSAo2tHa6c31PgYBBKGp3LQGbCrXb7btziBaUhODlmDIEh9qC346Qh5v1zRoHCwdMIZDA2dC7WhVe3hpu6za2by/VpLPEsuHu8zAXda92/pEWuJO0xTA72PJ5g8bsgELLglA14CTmpnHqEYqmtShK134Aua4SkQfMiUhWMWng41LxAA6TAWwdSq5Sbe3UrpLxXm/XENqM1CyB5xNOuZhu03MneKqFs0PFcfNKOeW2Kv7yaF9bkp+kVLEK+3nnC0lpVuXhDBITVe/3SpYau8xF2rPf9TrbJY5ZsdBpf3yROKlWvPl2bc+FVICIjRSUJ3dX5BknW4eapqky83aW+wiIgPnJK/Yal3dq+cFxOnj+65HK9j+Upf9k6ysnzaYk1wQ== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?fvuH04/zJVycLyFRKIp7DMjdwjj03NzEFT3C5Byd6uHDFhr/0xmJr7qBXSEE?= =?us-ascii?Q?QUavNgLUuIKNugxqMisQJ8vDe5G39pEJ5PG5fB1yF4T2xKl3zJNepY41tHJi?= =?us-ascii?Q?tqTi2E3itKA+Hc43nUt/6hmP6jiVpM3gq1UC4bp7bmSGZe5XQRX4Hgh+khrp?= =?us-ascii?Q?yN/O+j+/oHcS5z5JI/UZ2mvV9l4sOp6DBCGtExg8RLL2gLcNpTitRg5TMa1f?= =?us-ascii?Q?JSFXFrcm7Qv8yeYEn8/bmQ/xjjf0TzQCF7CYTZUjof9rmPCGOjxG+Tp2s6fS?= =?us-ascii?Q?yv19YYjjHiQ6+AopHOU1FdSmE731W6wGig9RH3h8mqozqX30hNGEmd9CPmsn?= =?us-ascii?Q?jXdj4dKmfeEkW2JsHM7D0jwX9e57wXi+D1hOj2G3qeViy/h+3nzfSSUmJd46?= =?us-ascii?Q?s8FyexDHAg3DZZ5HTB3XCZ2HDcSRXHN7z45XzjWcrvCzXq8oPUicvF47bs0l?= =?us-ascii?Q?9FOvfedKEoqf3nynEd7htjg0zqKKKMXLChnyEB2I7FWAk+BFFDS4+PlhkvHr?= =?us-ascii?Q?UJ/TnEYCyMjuCfCw+ojcQCH7Iq7BE5tYxmAcCfpg529UYtiG5g2g+qog+kJz?= =?us-ascii?Q?nRMdDu5fzwJLnxoU5FXjrY5tZE+EBbsNlfYPoXJLfgzTlZuAStLbVjtGFtfU?= =?us-ascii?Q?uLWlGMLcs1lAl1FDcSpGeOoJ6TdtmQkr6YWMdAlQl9v1VYUZqE3s3rbCTWDs?= =?us-ascii?Q?UzDLHYLgyLTKPB+GhMDVn4L4WlfBOYGSvu1nT0yJeZWlbUVLUD1THKx1bySQ?= =?us-ascii?Q?hKwm8f2XDgIsEVsT+bLQLYDqAT45QL9BHD2vDt7znO+vQddId7L0NnstOrxS?= =?us-ascii?Q?pW4g+ifMeEaMcns0ia4cMxkwYQ3q0gu60XqcyVq6DAPMubG3TSoCTN30eEzx?= =?us-ascii?Q?SkuV+S8JfY/CeT8yFvw/KpNC3dxiM9RqSdGf2fqOFH5eFEkzDHbpZZKdohrC?= =?us-ascii?Q?69wzasTybJISoIqCM7DGvKM1r8wCO+oad3WiX7BgNb5JlMWOSA0Gv89qXVx7?= =?us-ascii?Q?voep?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:50:41.9437 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: ec7d6c0f-39ae-469e-14a9-08d8b33d2225 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 6nmqXnTm9vNuelhvxZ0bB2kFuMohUYL7WnA55OkMiSNRa9gu4+34NUm9siTwQm/qu4O8oRpsbVAhe2n46G0/xg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: uLGeKtu9cS6wgJfOJG6j29eox1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045445; bh=lXU/tr77PYwn3SbW05NZmd+tZIEqXw2blaaTM9ri4qo=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=L7ESxA3vzAvyxCC6GEjLZINpZfUJx2zuSy/U1m5GeostfAfUInYsmXtiqfBQL+rTt/I B1c2oxRAUwsVj5wCEwggtngGY7dZttPPQMDek6Ms7Owiu/AMw9dXpCI1dnIGQ3iFGEF63 OmqYyIWYWqBU0OLkcAHj8EsV6wWcAo/ITps= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 Creating an SEC version of the library requires renaming an existing file which will result in the existing code failing ECC. Prior to renaming the existing file, fix the coding style to avoid the ECC failure. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Brijesh Singh Reviewed-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c b/Ovm= fPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c index 6422bc53bd5d..3a5bab657bd7 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c @@ -192,7 +192,8 @@ Split2MPageTo4K ( { PHYSICAL_ADDRESS PhysicalAddress4K; UINTN IndexOfPageTableEntries; - PAGE_TABLE_4K_ENTRY *PageTableEntry, *PageTableEntry1; + PAGE_TABLE_4K_ENTRY *PageTableEntry; + PAGE_TABLE_4K_ENTRY *PageTableEntry1; UINT64 AddressEncMask; =20 PageTableEntry =3D AllocatePageTableMemory(1); @@ -472,7 +473,7 @@ Split1GPageTo2M ( /** Set or Clear the memory encryption bit =20 - @param[in] PagetablePoint Page table entry pointer (PTE). + @param[in, out] PageTablePointer Page table entry pointer (PTE). @param[in] Mode Set or Clear encryption bit =20 **/ @@ -562,7 +563,6 @@ EnableReadOnlyPageWriteProtect ( @retval RETURN_UNSUPPORTED Setting the memory encyrption attrib= ute is not supported **/ - STATIC RETURN_STATUS EFIAPI @@ -635,7 +635,7 @@ SetMemoryEncDec ( =20 Status =3D EFI_SUCCESS; =20 - while (Length) + while (Length !=3D 0) { // // If Cr3BaseAddress is not specified then read the current CR3 @@ -683,7 +683,7 @@ SetMemoryEncDec ( // Valid 1GB page // If we have at least 1GB to go, we can just update this entry // - if (!(PhysicalAddress & (BIT30 - 1)) && Length >=3D BIT30) { + if ((PhysicalAddress & (BIT30 - 1)) =3D=3D 0 && Length >=3D BIT30) { SetOrClearCBit(&PageDirectory1GEntry->Uint64, Mode); DEBUG (( DEBUG_VERBOSE, @@ -744,7 +744,7 @@ SetMemoryEncDec ( // Valid 2MB page // If we have at least 2MB left to go, we can just update this ent= ry // - if (!(PhysicalAddress & (BIT21-1)) && Length >=3D BIT21) { + if ((PhysicalAddress & (BIT21-1)) =3D=3D 0 && Length >=3D BIT21) { SetOrClearCBit (&PageDirectory2MEntry->Uint64, Mode); PhysicalAddress +=3D BIT21; Length -=3D BIT21; --=20 2.30.0 -=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 (#69959): https://edk2.groups.io/g/devel/message/69959 Mute This Topic: https://groups.io/mt/79505923/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- From nobody Sat Apr 20 08:57:17 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+69960+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+69960+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 1610045473845581.0591159693506; Thu, 7 Jan 2021 10:51:13 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id IDK5YY1788612xEl8taNFZHh; Thu, 07 Jan 2021 10:51:13 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.88]) by mx.groups.io with SMTP id smtpd.web09.1132.1610045467854120403 for ; Thu, 07 Jan 2021 10:51:08 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=aABGZF8S7LCCr5f5+cUwlbw8YZuOlf9Xb33OgLqaXMzDVjvUuNhqlMwc8FxRFN/wvbu+dJBo8AD8E5kdtf0HOCKSm+nppGJGb3Ivmc6LygKP+I3o8WzcK5Yae+ImYis2uZ7LW+b1tf4hfT/mG7Bu23dvDm4T2Bg+hmzlWXrdl7YlFmhi/KW2wdB1JRS7D98P+XM9g/ngJyeYT6IRma+b14hsna42UHZNOtEhreGk1QSZzeYY58omhfnXQ+dAEX+tGqw/klE00d6XY2Qt6y6b0eLeVUkh55uEv9u2RTSgy78lLc82RbIfccx3aCM1DvsfnxLoKMLUiOhZl1udVP5ozA== 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=NiQTXdIfId1aD+V5VhuHBbe9HastbBsTNxGmDgLzWaA=; b=OehyV1XF+of1ESzNp9Xn4IMyw5Uce8LBjCufN3mhi9rUvCqhPfqS5FQqWdXq04Lf/EulACsZxppKFcJZ41zskTWhUSTIVwgcwGL8IUziiEFPjXlw5pBfwicQWKXDRs6AXF5YsyB3Zc01NQqZllWlbwL/1024cIuKAX5UXop/lOwInEJgqnfGeqrSrXZ3WQKn5m90Q+W1fx7yJoeHgryXhQg5I07Xf49LSJ95X2gckxHl/3FwjJS5UtZNzeogSnqMDMQTEAguZutiSrx95eom/wzWzclIhNfTHwEfW6kTa1FTHE6u1eskIFyjEwSLgF2+gKRYpNpaeTurotLzQwrv2g== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:51:05 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:51:05 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [edk2-devel] [PATCH v3 11/15] OvmfPkg/MemEncryptSevLib: Make the MemEncryptSevLib available for SEC Date: Thu, 7 Jan 2021 12:48:21 -0600 Message-ID: In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SN2PR01CA0016.prod.exchangelabs.com (2603:10b6:804:2::26) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by SN2PR01CA0016.prod.exchangelabs.com (2603:10b6:804:2::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:51:04 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 7808856d-7cf8-48c5-f21e-08d8b33d2ff6 X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: BYgBiZUp/WL0WLhxmcf7Ea7BDojH3ZShe2293/5Sz2nkF76UtC6epKIdH65zhtU98tcv3GYY156xljO0r/+CNp6mXn3QoaYzLAHeArSoNME6u4RZ/Uxq/FTTmmYSC1FU9gMnaSGnoJC1Nwo38hBNIEZPkxwUD+G0vR+92Y+1Gaxm3DtFFGB/kRvpfxTdT23B/Rl2rU1+CROc5EAtAIViA8qAVQrrrTWrPbEU5yhmjBY8uPEnvjLJkHN1dF8veyAKRqdEDuy9Ad2cwTU9ToRAiFrpqf1McHNguwKF5vIh7ZursWJUvreOzhog0MzTiW0IHXYx/1R4fqhFL55Iyxa4KhOfyl1YcgLk8GfYw4nws4XWVCZETl7Cqyc6uj5VcB0eLIx6d1A0T6L8qwnoMov85JGM6S8/Oztt78oE+v8qwAguTZC86K0W4ukgeqcmmsDulUG9gxFWYcb5aw0QpuWjaw== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?Me61L84iqVdmPdvUtz4tgQDeSYBtFSerXluNU0s9FhUoFtX2hsYm9CUA9QAs?= =?us-ascii?Q?MfpepQ7u5RYCAf+qpUGwAqyaJAc2r6uBcdZu3iucHPRyowzktpeYEMWgvFeK?= =?us-ascii?Q?7gUnr50u5fla44EJWr6rnjDlWzQ0/7R/n4rGgwTPZx+tyFmTgbbDxOAX7+FC?= =?us-ascii?Q?LjoF7ZjFvGeOedGnxPp11ok+/x7UCU+SoAu7nDpE61qyuAUCUEnmuZGl4SdF?= =?us-ascii?Q?m4xB+fi1ysMKURUirhIdjUQ+bcCMYb+0Pz6WgWk7yTRZYKC2FkfxCiy6YJNu?= =?us-ascii?Q?0eb44TeIiD0ZvfyYSH7hrqMkG8G+kbHYqQn5oCrliIcU6qsNr+VBBGczjkJn?= =?us-ascii?Q?rLQyXdwSWMOlG8TWuBo7Lql0MTYafJWGpfAxWoRh8mWhPwnQg/jv/zpQpKEn?= =?us-ascii?Q?75liUO0ST5h2HpS0DiqNUUnWaY8Dpq6dF9HthP37jzeuLvlj1OW8H+mLIVC5?= =?us-ascii?Q?qKPcPpSnltG6Z/wO5J3iO2YeUEy4FIoytXnYZuZJNNWmNOxDAizLf8NHNV5c?= =?us-ascii?Q?o+1VNBHyd/c6t6nglDpSJx9L9sqRB/DrgiVD/TRU6evVmbFSP/ovGLrLFL06?= =?us-ascii?Q?441m1xlt5FEsJR20C0DoCfy9dxSwz++VfgQgD5Ealn5HPVhD9Vy8HyVtFuGl?= =?us-ascii?Q?dvf7MNuKjAWz9hGOCPHHYdHdCqSnILmppw0Lkqsa8ikFTumgQ6VN2wC6oPOP?= =?us-ascii?Q?cVxefrxLSq+P8YG2sY5Si4r9ZjOtihoawgy2e2RcWcldG61Duuwg385VsT5a?= =?us-ascii?Q?f73MVm/zwJBjx6xYAjl6N4DKoE54mKbvsGRsgil2mKFD4/FeM3Hdh/3mTjl8?= =?us-ascii?Q?8nBOto9+vJg4Oihk4L/HaKzpa1u5mq8fYr/+4AOTza012sQ5KIacI5j8moES?= =?us-ascii?Q?N6QvQ+PfAJEoRFVYnDCrPtbPcboIsUNAms4XXGGat5viZE1GAXfdi+Ryi6le?= =?us-ascii?Q?3fM6hvkWuSBO3wjkZd3IJvWu7ZkBzIbDuGPjTAxsxLQ4AyoXWQhbD27gvpX4?= =?us-ascii?Q?/mmP?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:51:05.1275 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: 7808856d-7cf8-48c5-f21e-08d8b33d2ff6 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: xS2ZRB/1JIBvfKeSvJ7rUBklRNkuu+rYCvI2LQbwp67kFbG67VHvR/A5NVj8aNaZeLyPqj3HbBK5T0lPP3D8Ig== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: 6QrsjCyl8sqMUPdW8CIg59mOx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045473; bh=JDPsU/nYyknyxGg+/m57dUm0P+6lnvl0P5tGqwN7Y/Y=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=LIJQrDEhzIeCD88bkDfe2SH/VM3FadTBpn1FavbNL01ouULycZ8dUoSX/k1YIAJmGEY At/bWhSqD61rFYULHQmAvlzYpnfUZVPERR6zfhUhM6O8/BkmmOP5alP/6AFz90LbMrWCJ 4gWgcoQWdeN0K7JidV/nyqHS/1fJzbpPaks= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 In preparation for a new interface to be added to the MemEncryptSevLib library that will be used in SEC, create an SEC version of the library. This requires the creation of SEC specific files. Some of the current MemEncryptSevLib functions perform memory allocations which cannot be performed in SEC, so these interfaces will return an error during SEC. Also, the current MemEncryptSevLib library uses some static variables to optimize access to variables, which cannot be used in SEC. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Brijesh Singh Acked-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf = | 4 +- OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf = | 4 +- OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLib.inf = | 50 +++++++ OvmfPkg/Library/BaseMemEncryptSevLib/{MemEncryptSevLibInternal.c =3D> PeiD= xeMemEncryptSevLibInternal.c} | 0 OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c = | 155 ++++++++++++++++++++ OvmfPkg/Library/BaseMemEncryptSevLib/X64/{VirtualMemory.c =3D> PeiDxeVirtu= alMemory.c} | 0 OvmfPkg/Library/BaseMemEncryptSevLib/X64/SecVirtualMemory.c = | 80 ++++++++++ 7 files changed, 289 insertions(+), 4 deletions(-) diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf b= /OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf index 837db0876184..4480e4cc7c89 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf @@ -31,11 +31,11 @@ [Packages] =20 [Sources] DxeMemEncryptSevLibInternal.c - MemEncryptSevLibInternal.c + PeiDxeMemEncryptSevLibInternal.c =20 [Sources.X64] X64/MemEncryptSevLib.c - X64/VirtualMemory.c + X64/PeiDxeVirtualMemory.c X64/VirtualMemory.h =20 [Sources.IA32] diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf b= /OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf index c3cd046cb630..0697f1dab502 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf @@ -30,12 +30,12 @@ [Packages] UefiCpuPkg/UefiCpuPkg.dec =20 [Sources] - MemEncryptSevLibInternal.c + PeiDxeMemEncryptSevLibInternal.c PeiMemEncryptSevLibInternal.c =20 [Sources.X64] X64/MemEncryptSevLib.c - X64/VirtualMemory.c + X64/PeiDxeVirtualMemory.c X64/VirtualMemory.h =20 [Sources.IA32] diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLib.inf b= /OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLib.inf new file mode 100644 index 000000000000..7cd0111fe47b --- /dev/null +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLib.inf @@ -0,0 +1,50 @@ +## @file +# Library provides the helper functions for SEV guest +# +# Copyright (c) 2020 Advanced Micro Devices. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION =3D 1.25 + BASE_NAME =3D SecMemEncryptSevLib + FILE_GUID =3D 046388b4-430e-4e61-88f6-51ea21db2632 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D MemEncryptSevLib|SEC + +# +# The following information is for reference only and not required by the = build +# tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 +# + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + UefiCpuPkg/UefiCpuPkg.dec + +[Sources] + SecMemEncryptSevLibInternal.c + +[Sources.X64] + X64/MemEncryptSevLib.c + X64/SecVirtualMemory.c + X64/VirtualMemory.h + +[Sources.IA32] + Ia32/MemEncryptSevLib.c + +[LibraryClasses] + BaseLib + CpuLib + DebugLib + PcdLib + +[FixedPcd] + gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/MemEncryptSevLibInternal.= c b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiDxeMemEncryptSevLibInternal.c similarity index 100% rename from OvmfPkg/Library/BaseMemEncryptSevLib/MemEncryptSevLibInternal.c rename to OvmfPkg/Library/BaseMemEncryptSevLib/PeiDxeMemEncryptSevLibIntern= al.c diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibIntern= al.c b/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c new file mode 100644 index 000000000000..56d8f3f3183f --- /dev/null +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c @@ -0,0 +1,155 @@ +/** @file + + Secure Encrypted Virtualization (SEV) library helper function + + Copyright (c) 2020, Advanced Micro Devices, Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include + +/** + Reads and sets the status of SEV features. + + **/ +STATIC +UINT32 +EFIAPI +InternalMemEncryptSevStatus ( + VOID + ) +{ + UINT32 RegEax; + CPUID_MEMORY_ENCRYPTION_INFO_EAX Eax; + BOOLEAN ReadSevMsr; + SEC_SEV_ES_WORK_AREA *SevEsWorkArea; + + ReadSevMsr =3D FALSE; + + SevEsWorkArea =3D (SEC_SEV_ES_WORK_AREA *) FixedPcdGet32 (PcdSevEsWorkAr= eaBase); + if (SevEsWorkArea !=3D NULL && SevEsWorkArea->EncryptionMask !=3D 0) { + // + // The MSR has been read before, so it is safe to read it again and av= oid + // having to validate the CPUID information. + // + ReadSevMsr =3D TRUE; + } else { + // + // Check if memory encryption leaf exist + // + AsmCpuid (CPUID_EXTENDED_FUNCTION, &RegEax, NULL, NULL, NULL); + if (RegEax >=3D CPUID_MEMORY_ENCRYPTION_INFO) { + // + // CPUID Fn8000_001F[EAX] Bit 1 (Sev supported) + // + AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, &Eax.Uint32, NULL, NULL, NUL= L); + + if (Eax.Bits.SevBit) { + ReadSevMsr =3D TRUE; + } + } + } + + return ReadSevMsr ? AsmReadMsr32 (MSR_SEV_STATUS) : 0; +} + +/** + Returns a boolean to indicate whether SEV-ES is enabled. + + @retval TRUE SEV-ES is enabled + @retval FALSE SEV-ES is not enabled +**/ +BOOLEAN +EFIAPI +MemEncryptSevEsIsEnabled ( + VOID + ) +{ + MSR_SEV_STATUS_REGISTER Msr; + + Msr.Uint32 =3D InternalMemEncryptSevStatus (); + + return Msr.Bits.SevEsBit ? TRUE : FALSE; +} + +/** + Returns a boolean to indicate whether SEV is enabled. + + @retval TRUE SEV is enabled + @retval FALSE SEV is not enabled +**/ +BOOLEAN +EFIAPI +MemEncryptSevIsEnabled ( + VOID + ) +{ + MSR_SEV_STATUS_REGISTER Msr; + + Msr.Uint32 =3D InternalMemEncryptSevStatus (); + + return Msr.Bits.SevBit ? TRUE : FALSE; +} + +/** + Returns the SEV encryption mask. + + @return The SEV pagtable encryption mask +**/ +UINT64 +EFIAPI +MemEncryptSevGetEncryptionMask ( + VOID + ) +{ + CPUID_MEMORY_ENCRYPTION_INFO_EBX Ebx; + SEC_SEV_ES_WORK_AREA *SevEsWorkArea; + UINT64 EncryptionMask; + + SevEsWorkArea =3D (SEC_SEV_ES_WORK_AREA *) FixedPcdGet32 (PcdSevEsWorkAr= eaBase); + if (SevEsWorkArea !=3D NULL) { + EncryptionMask =3D SevEsWorkArea->EncryptionMask; + } else { + // + // CPUID Fn8000_001F[EBX] Bit 0:5 (memory encryption bit position) + // + AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, NULL, &Ebx.Uint32, NULL, NULL); + EncryptionMask =3D LShiftU64 (1, Ebx.Bits.PtePosBits); + } + + return EncryptionMask; +} + +/** + Locate the page range that covers the initial (pre-SMBASE-relocation) SM= RAM + Save State Map. + + @param[out] BaseAddress The base address of the lowest-address page = that + covers the initial SMRAM Save State Map. + + @param[out] NumberOfPages The number of pages in the page range that c= overs + the initial SMRAM Save State Map. + + @retval RETURN_SUCCESS BaseAddress and NumberOfPages have been set = on + output. + + @retval RETURN_UNSUPPORTED SMM is unavailable. +**/ +RETURN_STATUS +EFIAPI +MemEncryptSevLocateInitialSmramSaveStateMapPages ( + OUT UINTN *BaseAddress, + OUT UINTN *NumberOfPages + ) +{ + return RETURN_UNSUPPORTED; +} diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c b/Ovm= fPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c similarity index 100% rename from OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c rename to OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SecVirtualMemory.c b/= OvmfPkg/Library/BaseMemEncryptSevLib/X64/SecVirtualMemory.c new file mode 100644 index 000000000000..5c337ea0b820 --- /dev/null +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SecVirtualMemory.c @@ -0,0 +1,80 @@ +/** @file + + Virtual Memory Management Services to set or clear the memory encryption= bit + + Copyright (c) 2020, AMD Incorporated. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include + +#include "VirtualMemory.h" + +/** + This function clears memory encryption bit for the memory region specifi= ed by + PhysicalAddress and Length from the current page table context. + + @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use + current CR3) + @param[in] PhysicalAddress The physical address that is the sta= rt + address of a memory region. + @param[in] Length The length of memory region + @param[in] Flush Flush the caches before applying the + encryption mask + + @retval RETURN_SUCCESS The attributes were cleared for the + memory region. + @retval RETURN_INVALID_PARAMETER Number of pages is zero. + @retval RETURN_UNSUPPORTED Clearing the memory encyrption attri= bute + is not supported +**/ +RETURN_STATUS +EFIAPI +InternalMemEncryptSevSetMemoryDecrypted ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS PhysicalAddress, + IN UINTN Length, + IN BOOLEAN Flush + ) +{ + // + // This function is not available during SEC. + // + return RETURN_UNSUPPORTED; +} + +/** + This function sets memory encryption bit for the memory region specified= by + PhysicalAddress and Length from the current page table context. + + @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use + current CR3) + @param[in] PhysicalAddress The physical address that is the sta= rt + address of a memory region. + @param[in] Length The length of memory region + @param[in] Flush Flush the caches before applying the + encryption mask + + @retval RETURN_SUCCESS The attributes were set for the memo= ry + region. + @retval RETURN_INVALID_PARAMETER Number of pages is zero. + @retval RETURN_UNSUPPORTED Setting the memory encyrption attrib= ute + is not supported +**/ +RETURN_STATUS +EFIAPI +InternalMemEncryptSevSetMemoryEncrypted ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS PhysicalAddress, + IN UINTN Length, + IN BOOLEAN Flush + ) +{ + // + // This function is not available during SEC. + // + return RETURN_UNSUPPORTED; +} --=20 2.30.0 -=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 (#69960): https://edk2.groups.io/g/devel/message/69960 Mute This Topic: https://groups.io/mt/79505928/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- From nobody Sat Apr 20 08:57:17 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+69961+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+69961+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 1610045476808947.2485059331889; Thu, 7 Jan 2021 10:51:16 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id ZbSPYY1788612x3OKmcKOfpz; Thu, 07 Jan 2021 10:51:16 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.85]) by mx.groups.io with SMTP id smtpd.web10.1162.1610045475623419339 for ; Thu, 07 Jan 2021 10:51:15 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=TXrV2bz7tmi+720NPC/HGUN4gisfsIpg2/o8wPhhRQGMCN8AUvG9a6e6RvY6EkDrP8GarbOZ1xqsuo5ugoEkpfPM0JDQrHyHahotdgHEH/LrMM9vpg3P0Tkk4sFFjeqAfhkZQEv4N/XBXppVrNFbIrILQo3y8fKWdEwSgbFSpWsbUK9TedOrY99jTFZa7GQTet2Hozt3j0rOjCRqWPmTgL/rQm2tUo212X0lp8ag+FEN80MHHWTdS2+qA+0x7h1IipKspJcrvA6Oqi/OS+B+dW9QfnRVUD8VoXD1UL+cVQijCHIXxKbm9uCiG57Q2HAgrw0h2vhlkZlkIeNIX6FIQw== 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=VixXqr9fdu0Xk3pbBExKdDdhR8oJzArdr3SDPP3Xrqs=; b=JEd0/bBpuVnDFDuMbvOLTyoKtoqQhsEKUr8Oe+VfaTA7TPd+TNUOmdH1qhEJWLjsOkUC/uN6KtXvj/ObCh2C1SgHp0IRasXKWtNN71onMyuQgHcOVkecAq9aC+NbbSSWtfpKsB6ngaD+5Mxqees68LbxR5KzVgbhsIXCenKv/KoWBkIMNLFKy27VDbyTzWxPPf7M+zGj6Ng1lfjupEeg0X8aD69COlVGM3EGoyhPNQZyXDMVce3toxR9A+XaOkX3phNxXVWrAE4uQUJwssEsANOOOxuBa+Zrz6Mbnn0CslzdCmoSaSc5ba5Rqy7VVmEQN4YIueR61HOsaC6806h/TA== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:51:13 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:51:13 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [edk2-devel] [PATCH v3 12/15] OvmfPkg/MemEncryptSevLib: Address range encryption state interface Date: Thu, 7 Jan 2021 12:48:22 -0600 Message-ID: <0d98f4d42a2b67310c29bac7bcdcf1eda6835847.1610045305.git.thomas.lendacky@amd.com> In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SN2PR01CA0042.prod.exchangelabs.com (2603:10b6:804:2::52) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by SN2PR01CA0042.prod.exchangelabs.com (2603:10b6:804:2::52) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:51:12 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 3de10d0f-0176-4489-3b4f-08d8b33d34a4 X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:6108; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: ZZ+nFju1qhK2s1GdpZhBaFUZTLWlxCVdj7eLktRsJg0+g48ct1D9zqOG39eaPhCik6P6s8OKLUB76L2/Bzi5bN3cnOlww4fL3M4jzn08BprfCLQOwqUGbwMt/wrWAVQYxIAl/tQmBc+jbRkatX0W3a95UrZIk3cSo/bw1YLcFLd3Zy1bymxEY+UDCdfwzliKOYYM8GMwwuL0TqV9EINv230bDPxN7ot4k0vxIIdWDwI3kjwhFxjr2QJR4eCWW17ducWKluwVcCONSPP44riKJrTDG1OSVpn5l1XFDRDA8Kse6s25wEg+CeuvRb98VcYykTqW1MA5p7AU5XFw4mWoNHdUkjdRwGmGufQduEHMc73p+gIVvZOKGXBTHtgUQtVTMkWrj7+dVGSYIE0r102uUeCnaMBCxTfMG/0bckOBdAPtjiKfrfMxGfhJK4vdN7PzorOoA1jSXChJxaJNdNMxdQ== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?7Bs/+KiI5nUczNat7It0kjViu6kZYcywGu3fy7lzdhZYFUcJtKf2u8QWQjkh?= =?us-ascii?Q?29jz0taCgSFNOAwhojCUEpgUjdpRbyctmeeqewq7wCHdCA5RsilSQ30JRu/v?= =?us-ascii?Q?LVmNYXoaXlYRL05H9yKNTNCoaY81IYWU1s9iEZW0Jq2IXKSgxMckBs/mNE6W?= =?us-ascii?Q?ipRqMRJo2qbbRQ82okIn7Y6EuuStgQlkFpkiB8LmEBJaqh2IdWis2zLbQfrv?= =?us-ascii?Q?HxeCb4phXjLuWTRWqiGUjaiAOBJs2ARxmUHipWdFdCjZe+JBolJabVzJsm5p?= =?us-ascii?Q?2trx9WpPVTa30MFDZaV3UsHudKYld0RB6+q5HkeJkhke/rYCFZXb0589nq4f?= =?us-ascii?Q?vTWLqwK+VSJzmgqbBBdj1D0TQihgKV3Hoqbv+gSJSW7rFYUA6M/gf6KbztAY?= =?us-ascii?Q?PW+V/MElDtkV01xd8M+kpj3cXqVk+waP9qvTrO3dqrXxRvh5obqYnfK7L6to?= =?us-ascii?Q?rLhoEEW6OMC90n9Tj00KKTU8TzbQ3lkRfaKEhiWbV1e+ooiGGQMvAl+6KoLa?= =?us-ascii?Q?wFudLBIGILwf7JU3a01bizLm5tUNRtvuEWtY6GbjckjnpkwOLmL7HrIFyqyy?= =?us-ascii?Q?eT2bWxln9FIhvnNBHUK2XBIe/vd8ayxX+wnDiCmDKdm7Dy6DgeUsTTgWuUuK?= =?us-ascii?Q?7UjjsZcOkw2XfhlnswxTw80y8Cj+iSR8yNtrns2qjBOCDiMyclPUiqi5HlXk?= =?us-ascii?Q?yB9S0LwPgJtnxs/ulzNHU5xh+3WjmngcSX3bBhQP9Ir8Nbq/pIae57tRO63M?= =?us-ascii?Q?ldqXz1vbE0XB6F7Du1GF06+sEfPJB3XfRx/G5JV3JjgydTebmS5QC5YEUG1p?= =?us-ascii?Q?mW2z8IZVzU52dcgOmU8QTYGdzDGW4mOLcvmcQR60APntcVAXylJJZIzIYP/7?= =?us-ascii?Q?/sWsgcwbJpoC5/mr9VjUIL/9vqAPVpcUs105526tcSzP0h4DxVq62T1fGwxd?= =?us-ascii?Q?I1IvKdtncfpNmeV3WRGrmsFm+idqO0/OZY0T79pIv336wzSysdBrnWPP4g8r?= =?us-ascii?Q?58T+?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:51:13.0070 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: 3de10d0f-0176-4489-3b4f-08d8b33d34a4 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: kRXwRfGeV1HkRXzX5EgKwY9ugojS06xbm5AygsVua/95ofg/jI2r6I9m3Lbd67r0lTJfkfl+kKOOR5nSvDCC/w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: pMebahNpgQVG7JzUJTQt2z6Qx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045476; bh=3HlVaMQebHaK8VNHICc24ug5z0cUwY9N+H6kVt2wNOw=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=PmUjdfNAI5qwhom9posgbMQLUUToM8icNTPgTvqk9Jbni2IoGXVahULoCp7ue4somP5 sUl2YzWa4aBMt3JiQKmSERn0va5WCP0sDTNLu6V/z35AeJMa/wcVmmJbxDs/q0j5c9ftt KzsoXfBj85jVKq0ML76ijTQw4fUMwlU+8rc= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 Update the MemEncryptSevLib library to include an interface that can report the encryption state on a range of memory. The values will represent the range as being unencrypted, encrypted, a mix of unencrypted and encrypted, and error (e.g. ranges that aren't mapped). Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Brijesh Singh Acked-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf | 1 + OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf | 1 + OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLib.inf | 1 + OvmfPkg/Include/Library/MemEncryptSevLib.h | 33 ++++ OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h | 35 +++- OvmfPkg/Library/BaseMemEncryptSevLib/Ia32/MemEncryptSevLib.c | 31 ++- OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c | 32 ++- OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c | 19 +- OvmfPkg/Library/BaseMemEncryptSevLib/X64/SecVirtualMemory.c | 20 ++ OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c | 207 +++++= +++++++++++++++ 10 files changed, 368 insertions(+), 12 deletions(-) diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf b= /OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf index 4480e4cc7c89..8e3b8ddd5a95 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf @@ -36,6 +36,7 @@ [Sources] [Sources.X64] X64/MemEncryptSevLib.c X64/PeiDxeVirtualMemory.c + X64/VirtualMemory.c X64/VirtualMemory.h =20 [Sources.IA32] diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf b= /OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf index 0697f1dab502..03a78c32df28 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf @@ -36,6 +36,7 @@ [Sources] [Sources.X64] X64/MemEncryptSevLib.c X64/PeiDxeVirtualMemory.c + X64/VirtualMemory.c X64/VirtualMemory.h =20 [Sources.IA32] diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLib.inf b= /OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLib.inf index 7cd0111fe47b..279c38bfbc2c 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLib.inf +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLib.inf @@ -35,6 +35,7 @@ [Sources] [Sources.X64] X64/MemEncryptSevLib.c X64/SecVirtualMemory.c + X64/VirtualMemory.c X64/VirtualMemory.h =20 [Sources.IA32] diff --git a/OvmfPkg/Include/Library/MemEncryptSevLib.h b/OvmfPkg/Include/L= ibrary/MemEncryptSevLib.h index 872abe6725dc..ec470b8d0363 100644 --- a/OvmfPkg/Include/Library/MemEncryptSevLib.h +++ b/OvmfPkg/Include/Library/MemEncryptSevLib.h @@ -33,6 +33,16 @@ typedef struct _SEC_SEV_ES_WORK_AREA { UINT64 EncryptionMask; } SEC_SEV_ES_WORK_AREA; =20 +// +// Memory encryption address range states. +// +typedef enum { + MemEncryptSevAddressRangeUnencrypted, + MemEncryptSevAddressRangeEncrypted, + MemEncryptSevAddressRangeMixed, + MemEncryptSevAddressRangeError, +} MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE; + /** Returns a boolean to indicate whether SEV-ES is enabled. =20 @@ -147,4 +157,27 @@ MemEncryptSevGetEncryptionMask ( VOID ); =20 +/** + Returns the encryption state of the specified virtual address range. + + @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use + current CR3) + @param[in] BaseAddress Base address to check + @param[in] Length Length of virtual address range + + @retval MemEncryptSevAddressRangeUnencrypted Address range is mapped + unencrypted + @retval MemEncryptSevAddressRangeEncrypted Address range is mapped + encrypted + @retval MemEncryptSevAddressRangeMixed Address range is mapped mi= xed + @retval MemEncryptSevAddressRangeError Address range is not mapped +**/ +MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE +EFIAPI +MemEncryptSevGetAddressRangeState ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ); + #endif // _MEM_ENCRYPT_SEV_LIB_H_ diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h b/Ovm= fPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h index 26d26cd922a4..996f94f07ebb 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h @@ -3,7 +3,7 @@ Virtual Memory Management Services to set or clear the memory encryption= bit =20 Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
- Copyright (c) 2017, AMD Incorporated. All rights reserved.
+ Copyright (c) 2017 - 2020, AMD Incorporated. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -178,7 +178,17 @@ typedef struct { UINTN FreePages; } PAGE_TABLE_POOL; =20 +/** + Return the pagetable memory encryption mask. =20 + @return The pagetable memory encryption mask. + +**/ +UINT64 +EFIAPI +InternalGetMemEncryptionAddressMask ( + VOID + ); =20 /** This function clears memory encryption bit for the memory region specifi= ed by @@ -234,4 +244,27 @@ InternalMemEncryptSevSetMemoryEncrypted ( IN BOOLEAN Flush ); =20 +/** + Returns the encryption state of the specified virtual address range. + + @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use + current CR3) + @param[in] BaseAddress Base address to check + @param[in] Length Length of virtual address range + + @retval MemEncryptSevAddressRangeUnencrypted Address range is mapped + unencrypted + @retval MemEncryptSevAddressRangeEncrypted Address range is mapped + encrypted + @retval MemEncryptSevAddressRangeMixed Address range is mapped mi= xed + @retval MemEncryptSevAddressRangeError Address range is not mapped +**/ +MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE +EFIAPI +InternalMemEncryptSevGetAddressRangeState ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ); + #endif diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/Ia32/MemEncryptSevLib.c b= /OvmfPkg/Library/BaseMemEncryptSevLib/Ia32/MemEncryptSevLib.c index b4f6e5738e6e..12a5bf495bd7 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/Ia32/MemEncryptSevLib.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/Ia32/MemEncryptSevLib.c @@ -2,7 +2,7 @@ =20 Secure Encrypted Virtualization (SEV) library helper function =20 - Copyright (c) 2017, AMD Incorporated. All rights reserved.
+ Copyright (c) 2017 - 2020, AMD Incorporated. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -82,3 +82,32 @@ MemEncryptSevSetPageEncMask ( // return RETURN_UNSUPPORTED; } + +/** + Returns the encryption state of the specified virtual address range. + + @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use + current CR3) + @param[in] BaseAddress Base address to check + @param[in] Length Length of virtual address range + + @retval MemEncryptSevAddressRangeUnencrypted Address range is mapped + unencrypted + @retval MemEncryptSevAddressRangeEncrypted Address range is mapped + encrypted + @retval MemEncryptSevAddressRangeMixed Address range is mapped mi= xed + @retval MemEncryptSevAddressRangeError Address range is not mapped +**/ +MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE +EFIAPI +MemEncryptSevGetAddressRangeState ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ) +{ + // + // Memory is always encrypted in 32-bit mode + // + return MemEncryptSevAddressRangeEncrypted; +} diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c b/= OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c index cf0921e21464..4fea6a6be0ac 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c @@ -2,7 +2,7 @@ =20 Secure Encrypted Virtualization (SEV) library helper function =20 - Copyright (c) 2017, AMD Incorporated. All rights reserved.
+ Copyright (c) 2017 - 2020, AMD Incorporated. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -88,3 +88,33 @@ MemEncryptSevSetPageEncMask ( Flush ); } + +/** + Returns the encryption state of the specified virtual address range. + + @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use + current CR3) + @param[in] BaseAddress Base address to check + @param[in] Length Length of virtual address range + + @retval MemEncryptSevAddressRangeUnencrypted Address range is mapped + unencrypted + @retval MemEncryptSevAddressRangeEncrypted Address range is mapped + encrypted + @retval MemEncryptSevAddressRangeMixed Address range is mapped mi= xed + @retval MemEncryptSevAddressRangeError Address range is not mapped +**/ +MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE +EFIAPI +MemEncryptSevGetAddressRangeState ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ) +{ + return InternalMemEncryptSevGetAddressRangeState ( + Cr3BaseAddress, + BaseAddress, + Length + ); +} diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c= b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c index 3a5bab657bd7..d3455e812bd1 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c @@ -28,14 +28,14 @@ typedef enum { } MAP_RANGE_MODE; =20 /** - Get the memory encryption mask + Return the pagetable memory encryption mask. =20 - @param[out] EncryptionMask contains the pte mask. + @return The pagetable memory encryption mask. =20 **/ -STATIC UINT64 -GetMemEncryptionAddressMask ( +EFIAPI +InternalGetMemEncryptionAddressMask ( VOID ) { @@ -200,7 +200,7 @@ Split2MPageTo4K ( =20 PageTableEntry1 =3D PageTableEntry; =20 - AddressEncMask =3D GetMemEncryptionAddressMask (); + AddressEncMask =3D InternalGetMemEncryptionAddressMask (); =20 ASSERT (PageTableEntry !=3D NULL); ASSERT (*PageEntry2M & AddressEncMask); @@ -286,7 +286,7 @@ SetPageTablePoolReadOnly ( LevelSize[3] =3D SIZE_1GB; LevelSize[4] =3D SIZE_512GB; =20 - AddressEncMask =3D GetMemEncryptionAddressMask(); + AddressEncMask =3D InternalGetMemEncryptionAddressMask(); PageTable =3D (UINT64 *)(UINTN)PageTableBase; PoolUnitSize =3D PAGE_TABLE_POOL_UNIT_SIZE; =20 @@ -431,7 +431,7 @@ Split1GPageTo2M ( =20 PageDirectoryEntry =3D AllocatePageTableMemory(1); =20 - AddressEncMask =3D GetMemEncryptionAddressMask (); + AddressEncMask =3D InternalGetMemEncryptionAddressMask (); ASSERT (PageDirectoryEntry !=3D NULL); ASSERT (*PageEntry1G & AddressEncMask); // @@ -485,7 +485,7 @@ SetOrClearCBit( { UINT64 AddressEncMask; =20 - AddressEncMask =3D GetMemEncryptionAddressMask (); + AddressEncMask =3D InternalGetMemEncryptionAddressMask (); =20 if (Mode =3D=3D SetCBit) { *PageTablePointer |=3D AddressEncMask; @@ -527,6 +527,7 @@ DisableReadOnlyPageWriteProtect ( /** Enable Write Protect on pages marked as read-only. **/ +STATIC VOID EnableReadOnlyPageWriteProtect ( VOID @@ -605,7 +606,7 @@ SetMemoryEncDec ( // // Check if we have a valid memory encryption mask // - AddressEncMask =3D GetMemEncryptionAddressMask (); + AddressEncMask =3D InternalGetMemEncryptionAddressMask (); if (!AddressEncMask) { return RETURN_ACCESS_DENIED; } diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SecVirtualMemory.c b/= OvmfPkg/Library/BaseMemEncryptSevLib/X64/SecVirtualMemory.c index 5c337ea0b820..bca5e3febb1b 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SecVirtualMemory.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SecVirtualMemory.c @@ -13,6 +13,26 @@ =20 #include "VirtualMemory.h" =20 +/** + Return the pagetable memory encryption mask. + + @return The pagetable memory encryption mask. + +**/ +UINT64 +EFIAPI +InternalGetMemEncryptionAddressMask ( + VOID + ) +{ + UINT64 EncryptionMask; + + EncryptionMask =3D MemEncryptSevGetEncryptionMask (); + EncryptionMask &=3D PAGING_1G_ADDRESS_MASK_64; + + return EncryptionMask; +} + /** This function clears memory encryption bit for the memory region specifi= ed by PhysicalAddress and Length from the current page table context. diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c b/Ovm= fPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c new file mode 100644 index 000000000000..36aabcf556a7 --- /dev/null +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.c @@ -0,0 +1,207 @@ +/** @file + + Virtual Memory Management Services to test an address range encryption s= tate + + Copyright (c) 2020, AMD Incorporated. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include + +#include "VirtualMemory.h" + +/** + Returns the (updated) address range state based upon the page table + entry. + + @param[in] CurrentState The current address range state + @param[in] PageDirectoryEntry The page table entry to check + @param[in] AddressEncMask The encryption mask + + @retval MemEncryptSevAddressRangeUnencrypted Address range is mapped + unencrypted + @retval MemEncryptSevAddressRangeEncrypted Address range is mapped + encrypted + @retval MemEncryptSevAddressRangeMixed Address range is mapped mi= xed +**/ +STATIC +MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE +UpdateAddressState ( + IN MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE CurrentState, + IN UINT64 PageDirectoryEntry, + IN UINT64 AddressEncMask + ) +{ + if (CurrentState =3D=3D MemEncryptSevAddressRangeEncrypted) { + if ((PageDirectoryEntry & AddressEncMask) =3D=3D 0) { + CurrentState =3D MemEncryptSevAddressRangeMixed; + } + } else if (CurrentState =3D=3D MemEncryptSevAddressRangeUnencrypted) { + if ((PageDirectoryEntry & AddressEncMask) !=3D 0) { + CurrentState =3D MemEncryptSevAddressRangeMixed; + } + } else if (CurrentState =3D=3D MemEncryptSevAddressRangeError) { + // + // First address check, set initial state + // + if ((PageDirectoryEntry & AddressEncMask) =3D=3D 0) { + CurrentState =3D MemEncryptSevAddressRangeUnencrypted; + } else { + CurrentState =3D MemEncryptSevAddressRangeEncrypted; + } + } + + return CurrentState; +} + +/** + Returns the encryption state of the specified virtual address range. + + @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use + current CR3) + @param[in] BaseAddress Base address to check + @param[in] Length Length of virtual address range + + @retval MemEncryptSevAddressRangeUnencrypted Address range is mapped + unencrypted + @retval MemEncryptSevAddressRangeEncrypted Address range is mapped + encrypted + @retval MemEncryptSevAddressRangeMixed Address range is mapped mi= xed + @retval MemEncryptSevAddressRangeError Address range is not mapped +**/ +MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE +EFIAPI +InternalMemEncryptSevGetAddressRangeState ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ) +{ + PAGE_MAP_AND_DIRECTORY_POINTER *PageMapLevel4Entry; + PAGE_MAP_AND_DIRECTORY_POINTER *PageUpperDirectoryPointerEntry; + PAGE_MAP_AND_DIRECTORY_POINTER *PageDirectoryPointerEntry; + PAGE_TABLE_1G_ENTRY *PageDirectory1GEntry; + PAGE_TABLE_ENTRY *PageDirectory2MEntry; + PAGE_TABLE_4K_ENTRY *PageTableEntry; + UINT64 AddressEncMask; + UINT64 PgTableMask; + PHYSICAL_ADDRESS Address; + PHYSICAL_ADDRESS AddressEnd; + MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE State; + + // + // If Cr3BaseAddress is not specified then read the current CR3 + // + if (Cr3BaseAddress =3D=3D 0) { + Cr3BaseAddress =3D AsmReadCr3(); + } + + AddressEncMask =3D MemEncryptSevGetEncryptionMask (); + AddressEncMask &=3D PAGING_1G_ADDRESS_MASK_64; + + PgTableMask =3D AddressEncMask | EFI_PAGE_MASK; + + State =3D MemEncryptSevAddressRangeError; + + // + // Encryption is on a page basis, so start at the beginning of the + // virtual address page boundary and walk page-by-page. + // + Address =3D (PHYSICAL_ADDRESS) (UINTN) BaseAddress & ~EFI_PAGE_MASK; + AddressEnd =3D (PHYSICAL_ADDRESS) + (UINTN) (BaseAddress + Length); + + while (Address < AddressEnd) { + PageMapLevel4Entry =3D (VOID*) (Cr3BaseAddress & ~PgTableMask); + PageMapLevel4Entry +=3D PML4_OFFSET (Address); + if (!PageMapLevel4Entry->Bits.Present) { + return MemEncryptSevAddressRangeError; + } + + PageDirectory1GEntry =3D (VOID *) ( + (PageMapLevel4Entry->Bits.PageTableBaseAddres= s << + 12) & ~PgTableMask + ); + PageDirectory1GEntry +=3D PDP_OFFSET (Address); + if (!PageDirectory1GEntry->Bits.Present) { + return MemEncryptSevAddressRangeError; + } + + // + // If the MustBe1 bit is not 1, it's not actually a 1GB entry + // + if (PageDirectory1GEntry->Bits.MustBe1) { + // + // Valid 1GB page + // + State =3D UpdateAddressState ( + State, + PageDirectory1GEntry->Uint64, + AddressEncMask + ); + + Address +=3D BIT30; + continue; + } + + // + // Actually a PDP + // + PageUpperDirectoryPointerEntry =3D + (PAGE_MAP_AND_DIRECTORY_POINTER *) PageDirectory1GEntry; + PageDirectory2MEntry =3D + (VOID *) ( + (PageUpperDirectoryPointerEntry->Bits.PageTableBaseAddress << + 12) & ~PgTableMask + ); + PageDirectory2MEntry +=3D PDE_OFFSET (Address); + if (!PageDirectory2MEntry->Bits.Present) { + return MemEncryptSevAddressRangeError; + } + + // + // If the MustBe1 bit is not a 1, it's not a 2MB entry + // + if (PageDirectory2MEntry->Bits.MustBe1) { + // + // Valid 2MB page + // + State =3D UpdateAddressState ( + State, + PageDirectory2MEntry->Uint64, + AddressEncMask + ); + + Address +=3D BIT21; + continue; + } + + // + // Actually a PMD + // + PageDirectoryPointerEntry =3D + (PAGE_MAP_AND_DIRECTORY_POINTER *)PageDirectory2MEntry; + PageTableEntry =3D + (VOID *)( + (PageDirectoryPointerEntry->Bits.PageTableBaseAddress << + 12) & ~PgTableMask + ); + PageTableEntry +=3D PTE_OFFSET (Address); + if (!PageTableEntry->Bits.Present) { + return MemEncryptSevAddressRangeError; + } + + State =3D UpdateAddressState ( + State, + PageTableEntry->Uint64, + AddressEncMask + ); + + Address +=3D EFI_PAGE_SIZE; + } + + return State; +} --=20 2.30.0 -=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 (#69961): https://edk2.groups.io/g/devel/message/69961 Mute This Topic: https://groups.io/mt/79505931/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- From nobody Sat Apr 20 08:57:17 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+69962+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+69962+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 1610045499931279.60371688421617; Thu, 7 Jan 2021 10:51:39 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id FsonYY1788612xrSNvCIwo3E; Thu, 07 Jan 2021 10:51:39 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.56]) by mx.groups.io with SMTP id smtpd.web08.1155.1610045498892406354 for ; Thu, 07 Jan 2021 10:51:39 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LHf8xrW14KHu4tRACfhmIInF1ZD/kpzNBOkf750O4j3rS7QatXdHhdE3AwNlW3j/1OgZTa29ulLzHY3NMdPDm9p/dsuqMjTTrBHZfLJ9mleP0AKZ+df+qa4m2Si5UcH/5uajaNtCDiPeDx+wTilSvwcNaE2EgY+5rs4JtDBqC2PS9/medq47/7PA96WLpt+pQwJxlipSI9WxGohvnrq1CAakCMx+3/YOt6yg7Bg/23mHq06cPK+XoO1NStaANDlLVdVGsu/Hw5Xyju3Nx3RcEjeq7qHcBM6hs+5oXrzIW/mKo4ON9p3bKUkqHcWIC5nlGkC8zjGZX9CURuLV+ugbnw== 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=ffHI3AmyEM4stUfCNSJ1IvNLlojYatXSvZa/W83VfSA=; b=KQEobkavVQX0uYZHoU2ykkfFWMRxiJGxArzMqPM/Fao9JJkfUhhwaAahshDvm7c3e13bFnvWHvSDy8CbvGSUDOgz+cDFt5bWTD+3+yaMFNV1Qw1u1kV/gcZC9I2QJdrtQAmWibcNJHEhNIopvXDMXsgmlcXMfxHoneCpZgRENtNwKRK5rn+B+N+PHi7Oc9q6Zfq4rNGf+YPUdWEQQC7Y9urGDoE2ke1XDAV+PdPCQ5LJshP74HnHzt7EnUIMzWOMbrGbTtz6eDE0elUPAN9u2MuZGAEJwQlGAV6Jz0IOwdDCaDzxoYISb+qzuA2fp8uhuYs6Jzo5gd8mwDxgqfNuOA== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:51:36 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:51:36 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [edk2-devel] [PATCH v3 13/15] OvmfPkg/VmgExitLib: Support nested #VCs Date: Thu, 7 Jan 2021 12:48:23 -0600 Message-ID: In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SN2PR01CA0034.prod.exchangelabs.com (2603:10b6:804:2::44) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by SN2PR01CA0034.prod.exchangelabs.com (2603:10b6:804:2::44) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:51:35 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 6e317503-d458-4fc0-ff0a-08d8b33d426f X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: /fs8CTDOoOmroLhnKR7OrUksT1rnuyjCaqZHrDv+wBunmsdKDxTZRqFMBq2sue4d7fXYB4qCulMso5IvCxulojC40lB0RniDujZxGFye2BPHlP80/4fRdCIopMqI2ywBnVlHezaLEiic9QkPHeicqjU47hI+gjOnyCxh4GA2hXU4enDCt9lP2ENvwrijarkqO4TqoXmC0cFrGp10mj2B18yEUvhijhUMWxP4hc6MYff7p+IVKFL41nL3in9Me0GsDdr6BV2y+Zte9MxhMYiyRnBQlG+N0jjQ6QdB5HAn6bISVpPhCkb0o6ZYWmr/aD+O2nzIRrfpmU+nphkpnh4ltlHWLVb4rK/v9xvTAsMEQad1ohjPbtaCuyBWsxW5CyGJCpb8cMXGOrQ6fW/Qji0BisaClUdwXqbyw9NtgGKiHiJIkG40SCc6eUBTOWUb+a8ObvcNZZVOxM2yTvBeMg3kuw== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?c4rKEIYxD/aIZOXOmFY1iOT0y9MEXFPymQz2C31tgAPT2UrXT6Ru7IpT2rAq?= =?us-ascii?Q?/O+8lwfN5crz45WF3D7TRBWPIq7cq2CPm6MX00OO3CGiiBL/jQ2CIjU9+thd?= =?us-ascii?Q?NzpgslQWZufXjk0UpExOjft3+q4QslIU9idolc6docrZE+hx5Cm4qv2/PUma?= =?us-ascii?Q?EOKYk3xeparm/RqaUJ/iFNXaGBoHBjJt/93OzFJCpnQXqu7Eyz5B09LdwCru?= =?us-ascii?Q?IPvwkQmGBk/qumSTiTEoYPeQvQ7aPQE8dnAhz+FjS19eHQqlqRhfuXiLbBhr?= =?us-ascii?Q?D1xz46E/WjNMp9YJrETNiPCtp3rAmQCsShSwQl4vyCQNCCUNfmpCfsDKCF0a?= =?us-ascii?Q?5V+44w30kTE20vHs0y5pFKdNCaINcYvRk5sCDUmYigokIu4breU3ybL8Gspi?= =?us-ascii?Q?t8Bc5kcdWM818DibhXh7yHJn/D1FVeq2uxxGLTuN6WU9lOtIfea2JthuAYS+?= =?us-ascii?Q?OinWeQO8U9R7YPTzw2sloyd6AaV+qqeRbFI6AWCYo3A3GBEJnga7EKXXnjlN?= =?us-ascii?Q?D7shuQMzEGHy+q6RgKSXegnQhMjHRlpJutOQHGmO4UkUvwMsgZfL5UUq/rVh?= =?us-ascii?Q?vmgBPWdbpY3UmYrZu2ZT1qHI4zeHQ1JkcQXTiQyD6oE7wYmFVvNE2acv3HqH?= =?us-ascii?Q?iklBwNCG4/okkr66nNJjMNc8t+2E1vN94Nr8q0DNDtfUyDOiJiDeyTe6pzGc?= =?us-ascii?Q?uYVXPYBfvhwjwvaZTtXGtMZXn+hyxihd4EfnIK09WVPMGRgVNLDGx5LUz3Gy?= =?us-ascii?Q?/PwhhLPGgioCmph3M46ursD7BTru+Kk7fLtYAIZOj9sXhTVXKXvn9c6b8mIs?= =?us-ascii?Q?bjSgdMhZ5cV/n04Q9FgG/8bRelMs0jO1Nzj7HdwQta5idT9ot6IIRLBv9+oo?= =?us-ascii?Q?PqbHjxFp+85C8i/yr8Vxk9eY74rTYlsGbK9hJQwbPgqYZPXe+9dn0V+vVzUA?= =?us-ascii?Q?WD5bdInzRmi3slURsy40WKCr2u1bqVmwExmJ6GhSreKX1fc/YJEjgiarc+2I?= =?us-ascii?Q?zIES?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:51:36.1518 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: 6e317503-d458-4fc0-ff0a-08d8b33d426f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: WPYEHeHIZlwrnb4mGeLvd1inBZ+B7KQ3oeIEkK9ARIoYUCjfHXwphfHdXfcidr1iAmMEI7MjLmWGA2RM3MfLsA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: JM2VxUpXSXrIQ2QtuI5WhW8Ex1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045499; bh=pTXxSZMGGpTbVnZj7ata+Xsx3KQ7ihcy9xcCCw+kXMI=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=VsJpeZBcqq9z1+Hff8Jj2c94tMqaLKIEoUSjXLB2kXkipzeomGSNz24MMj4spka7yaQ BDAQwnH5vChnsrKRy8RP5XqWbDgh0izm7lD7KF6iLO3rNOaE4vSnMDubBApgFTtGPalLH boMMF5TL6t/dCc0mTJNvOwLRDDL85poQH08= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 In order to be able to issue messages or make interface calls that cause another #VC (e.g. GetLocalApicBaseAddress () issues RDMSR), add support for nested #VCs. In order to support nested #VCs, GHCB backup pages are required. If a #VC is received while currently processing a #VC, a backup of the current GHCB content is made. This allows the #VC handler to continue processing the new #VC. Upon completion of the new #VC, the GHCB is restored from the backup page. The #VC recursion level is tracked in the per-vCPU variable area. Support is added to handle up to one nested #VC (or two #VCs total). If a second nested #VC is encountered, an ASSERT will be issued and the vCPU will enter CpuDeadLoop (). For SEC, the GHCB backup pages are reserved in the OvmfPkgX64.fdf memory layout, with two new fixed PCDs to provide the address and size of the backup area. For PEI/DXE, the GHCB backup pages are allocated as boot services pages using the memory allocation library. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Brijesh Singh Acked-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/OvmfPkg.dec | 2 + OvmfPkg/AmdSev/AmdSevX64.dsc | 1 + OvmfPkg/OvmfPkgX64.dsc | 1 + OvmfPkg/AmdSev/AmdSevX64.fdf | 3 + OvmfPkg/OvmfPkgX64.fdf | 3 + OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf | 43 ++++++++ OvmfPkg/Library/VmgExitLib/VmgExitLib.inf | 4 +- OvmfPkg/Include/Library/MemEncryptSevLib.h | 23 +++++ OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.h | 53 ++++++++++ OvmfPkg/Library/VmgExitLib/PeiDxeVmgExitVcHandler.c | 103 ++++++++++++++++= ++ OvmfPkg/Library/VmgExitLib/SecVmgExitVcHandler.c | 109 ++++++++++++++++= ++++ OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c | 48 +++++---- OvmfPkg/PlatformPei/AmdSev.c | 38 +++++-- 13 files changed, 404 insertions(+), 27 deletions(-) diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index 50d7b27d941c..54804962ec02 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -304,6 +304,8 @@ [PcdsFixedAtBuild] ## The base address of the SEC GHCB page used by SEV-ES. gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBase|0|UINT32|0x40 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbSize|0|UINT32|0x41 + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase|0|UINT32|0x44 + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupSize|0|UINT32|0x45 =20 ## The base address and size of the SEV Launch Secret Area provisioned # after remote attestation. If this is set in the .fdf, the platform diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc index d39436e7afc9..c4d93f39b9f1 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.dsc +++ b/OvmfPkg/AmdSev/AmdSevX64.dsc @@ -236,6 +236,7 @@ [LibraryClasses.common.SEC] !else CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiC= puExceptionHandlerLib.inf !endif + VmgExitLib|OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf =20 [LibraryClasses.common.PEI_CORE] HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 799468e08e92..bfa9dd7cac1f 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -265,6 +265,7 @@ [LibraryClasses.common.SEC] !else CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiC= puExceptionHandlerLib.inf !endif + VmgExitLib|OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf =20 [LibraryClasses.common.PEI_CORE] HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf diff --git a/OvmfPkg/AmdSev/AmdSevX64.fdf b/OvmfPkg/AmdSev/AmdSevX64.fdf index e8fd4b8c7b89..c0098502aa90 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.fdf +++ b/OvmfPkg/AmdSev/AmdSevX64.fdf @@ -62,6 +62,9 @@ [FD.MEMFD] 0x00C000|0x001000 gUefiOvmfPkgTokenSpaceGuid.PcdSevLaunchSecretBase|gUefiOvmfPkgTokenSpaceGu= id.PcdSevLaunchSecretSize =20 +0x00D000|0x001000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase|gUefiOvmfPkgTokenSpace= Guid.PcdOvmfSecGhcbBackupSize + 0x010000|0x010000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpace= Guid.PcdOvmfSecPeiTempRamSize =20 diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index 1a2ef5bf2ae3..d519f8532822 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -85,6 +85,9 @@ [FD.MEMFD] 0x00B000|0x001000 gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase|gUefiCpuPkgTokenSpaceGuid.P= cdSevEsWorkAreaSize =20 +0x00C000|0x001000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase|gUefiOvmfPkgTokenSpace= Guid.PcdOvmfSecGhcbBackupSize + 0x010000|0x010000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpace= Guid.PcdOvmfSecPeiTempRamSize =20 diff --git a/OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf b/OvmfPkg/Library= /VmgExitLib/SecVmgExitLib.inf new file mode 100644 index 000000000000..df14de3c21bc --- /dev/null +++ b/OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf @@ -0,0 +1,43 @@ +## @file +# VMGEXIT Support Library. +# +# Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D SecVmgExitLib + FILE_GUID =3D dafff819-f86c-4cff-a70e-83161e5bcf9a + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D VmgExitLib|SEC + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D X64 +# + +[Sources.common] + VmgExitLib.c + VmgExitVcHandler.c + VmgExitVcHandler.h + SecVmgExitVcHandler.c + +[Packages] + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + UefiCpuPkg/UefiCpuPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + PcdLib + +[FixedPcd] + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupSize + diff --git a/OvmfPkg/Library/VmgExitLib/VmgExitLib.inf b/OvmfPkg/Library/Vm= gExitLib/VmgExitLib.inf index d003ac63173e..b3c3e56ecff8 100644 --- a/OvmfPkg/Library/VmgExitLib/VmgExitLib.inf +++ b/OvmfPkg/Library/VmgExitLib/VmgExitLib.inf @@ -12,7 +12,7 @@ [Defines] FILE_GUID =3D 0e923c25-13cd-430b-8714-ffe85652a97b MODULE_TYPE =3D BASE VERSION_STRING =3D 1.0 - LIBRARY_CLASS =3D VmgExitLib + LIBRARY_CLASS =3D VmgExitLib|PEIM DXE_CORE DXE_DRIVER D= XE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_DRIVER =20 # # The following information is for reference only and not required by the = build tools. @@ -23,6 +23,8 @@ [Defines] [Sources.common] VmgExitLib.c VmgExitVcHandler.c + VmgExitVcHandler.h + PeiDxeVmgExitVcHandler.c =20 [Packages] MdePkg/MdePkg.dec diff --git a/OvmfPkg/Include/Library/MemEncryptSevLib.h b/OvmfPkg/Include/L= ibrary/MemEncryptSevLib.h index ec470b8d0363..99f15a7d1271 100644 --- a/OvmfPkg/Include/Library/MemEncryptSevLib.h +++ b/OvmfPkg/Include/Library/MemEncryptSevLib.h @@ -13,6 +13,29 @@ =20 #include =20 +// +// Define the maximum number of #VCs allowed (e.g. the level of nesting +// that is allowed =3D> 2 allows for 1 nested #VCs). I this value is chang= ed, +// be sure to increase the size of +// gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupSize +// in any FDF file using this PCD. +// +#define VMGEXIT_MAXIMUM_VC_COUNT 2 + +// +// Per-CPU data mapping structure +// Use UINT32 for cached indicators and compare to a specific value +// so that the hypervisor can't indicate a value is cached by just +// writing random data to that area. +// +typedef struct { + UINT32 Dr7Cached; + UINT64 Dr7; + + UINTN VcCount; + VOID *GhcbBackupPages; +} SEV_ES_PER_CPU_DATA; + // // Internal structure for holding SEV-ES information needed during SEC pha= se // and valid only during SEC phase and early PEI during platform diff --git a/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.h b/OvmfPkg/Librar= y/VmgExitLib/VmgExitVcHandler.h new file mode 100644 index 000000000000..3a37cb04f616 --- /dev/null +++ b/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.h @@ -0,0 +1,53 @@ +/** @file + X64 #VC Exception Handler functon header file. + + Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef __VMG_EXIT_VC_HANDLER_H__ +#define __VMG_EXIT_VC_HANDLER_H__ + +#include +#include +#include + +/** + Handle a #VC exception. + + Performs the necessary processing to handle a #VC exception. + + @param[in, out] Ghcb Pointer to the GHCB + @param[in, out] ExceptionType Pointer to an EFI_EXCEPTION_TYPE to be s= et + as value to use on error. + @param[in, out] SystemContext Pointer to EFI_SYSTEM_CONTEXT + + @retval EFI_SUCCESS Exception handled + @retval EFI_UNSUPPORTED #VC not supported, (new) exception value= to + propagate provided + @retval EFI_PROTOCOL_ERROR #VC handling failed, (new) exception val= ue to + propagate provided + +**/ +EFI_STATUS +EFIAPI +InternalVmgExitHandleVc ( + IN OUT GHCB *Ghcb, + IN OUT EFI_EXCEPTION_TYPE *ExceptionType, + IN OUT EFI_SYSTEM_CONTEXT SystemContext + ); + +/** + Routine to allow ASSERT from within #VC. + + @param[in, out] SevEsData Pointer to the per-CPU data + +**/ +VOID +EFIAPI +VmgExitIssueAssert ( + IN OUT SEV_ES_PER_CPU_DATA *SevEsData + ); + +#endif diff --git a/OvmfPkg/Library/VmgExitLib/PeiDxeVmgExitVcHandler.c b/OvmfPkg/= Library/VmgExitLib/PeiDxeVmgExitVcHandler.c new file mode 100644 index 000000000000..fb4942df37ca --- /dev/null +++ b/OvmfPkg/Library/VmgExitLib/PeiDxeVmgExitVcHandler.c @@ -0,0 +1,103 @@ +/** @file + X64 #VC Exception Handler functon. + + Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include + +#include "VmgExitVcHandler.h" + +/** + Handle a #VC exception. + + Performs the necessary processing to handle a #VC exception. + + @param[in, out] ExceptionType Pointer to an EFI_EXCEPTION_TYPE to be s= et + as value to use on error. + @param[in, out] SystemContext Pointer to EFI_SYSTEM_CONTEXT + + @retval EFI_SUCCESS Exception handled + @retval EFI_UNSUPPORTED #VC not supported, (new) exception value= to + propagate provided + @retval EFI_PROTOCOL_ERROR #VC handling failed, (new) exception val= ue to + propagate provided + +**/ +EFI_STATUS +EFIAPI +VmgExitHandleVc ( + IN OUT EFI_EXCEPTION_TYPE *ExceptionType, + IN OUT EFI_SYSTEM_CONTEXT SystemContext + ) +{ + MSR_SEV_ES_GHCB_REGISTER Msr; + GHCB *Ghcb; + GHCB *GhcbBackup; + EFI_STATUS VcRet; + BOOLEAN InterruptState; + SEV_ES_PER_CPU_DATA *SevEsData; + + InterruptState =3D GetInterruptState (); + if (InterruptState) { + DisableInterrupts (); + } + + Msr.GhcbPhysicalAddress =3D AsmReadMsr64 (MSR_SEV_ES_GHCB); + ASSERT (Msr.GhcbInfo.Function =3D=3D 0); + ASSERT (Msr.Ghcb !=3D 0); + + Ghcb =3D Msr.Ghcb; + GhcbBackup =3D NULL; + + SevEsData =3D (SEV_ES_PER_CPU_DATA *) (Ghcb + 1); + SevEsData->VcCount++; + + // + // Check for maximum PEI/DXE #VC nesting. + // + if (SevEsData->VcCount > VMGEXIT_MAXIMUM_VC_COUNT) { + VmgExitIssueAssert (SevEsData); + } else if (SevEsData->VcCount > 1) { + // + // Nested #VC + // + if (SevEsData->GhcbBackupPages =3D=3D NULL) { + VmgExitIssueAssert (SevEsData); + } + + // + // Save the active GHCB to a backup page. + // To access the correct backup page, increment the backup page poin= ter + // based on the current VcCount. + // + GhcbBackup =3D (GHCB *) SevEsData->GhcbBackupPages; + GhcbBackup +=3D (SevEsData->VcCount - 2); + + CopyMem (GhcbBackup, Ghcb, sizeof (*Ghcb)); + } + + VcRet =3D InternalVmgExitHandleVc (Ghcb, ExceptionType, SystemContext); + + if (GhcbBackup !=3D NULL) { + // + // Restore the active GHCB from the backup page. + // + CopyMem (Ghcb, GhcbBackup, sizeof (*Ghcb)); + } + + SevEsData->VcCount--; + + if (InterruptState) { + EnableInterrupts (); + } + + return VcRet; +} diff --git a/OvmfPkg/Library/VmgExitLib/SecVmgExitVcHandler.c b/OvmfPkg/Lib= rary/VmgExitLib/SecVmgExitVcHandler.c new file mode 100644 index 000000000000..85853d334b35 --- /dev/null +++ b/OvmfPkg/Library/VmgExitLib/SecVmgExitVcHandler.c @@ -0,0 +1,109 @@ +/** @file + X64 #VC Exception Handler functon. + + Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include + +#include "VmgExitVcHandler.h" + +/** + Handle a #VC exception. + + Performs the necessary processing to handle a #VC exception. + + @param[in, out] ExceptionType Pointer to an EFI_EXCEPTION_TYPE to be s= et + as value to use on error. + @param[in, out] SystemContext Pointer to EFI_SYSTEM_CONTEXT + + @retval EFI_SUCCESS Exception handled + @retval EFI_UNSUPPORTED #VC not supported, (new) exception value= to + propagate provided + @retval EFI_PROTOCOL_ERROR #VC handling failed, (new) exception val= ue to + propagate provided + +**/ +EFI_STATUS +EFIAPI +VmgExitHandleVc ( + IN OUT EFI_EXCEPTION_TYPE *ExceptionType, + IN OUT EFI_SYSTEM_CONTEXT SystemContext + ) +{ + MSR_SEV_ES_GHCB_REGISTER Msr; + GHCB *Ghcb; + GHCB *GhcbBackup; + EFI_STATUS VcRet; + BOOLEAN InterruptState; + SEV_ES_PER_CPU_DATA *SevEsData; + + InterruptState =3D GetInterruptState (); + if (InterruptState) { + DisableInterrupts (); + } + + Msr.GhcbPhysicalAddress =3D AsmReadMsr64 (MSR_SEV_ES_GHCB); + ASSERT (Msr.GhcbInfo.Function =3D=3D 0); + ASSERT (Msr.Ghcb !=3D 0); + + Ghcb =3D Msr.Ghcb; + GhcbBackup =3D NULL; + + SevEsData =3D (SEV_ES_PER_CPU_DATA *) (Ghcb + 1); + SevEsData->VcCount++; + + // + // Check for maximum SEC #VC nesting. + // + if (SevEsData->VcCount > VMGEXIT_MAXIMUM_VC_COUNT) { + VmgExitIssueAssert (SevEsData); + } else if (SevEsData->VcCount > 1) { + UINTN GhcbBackupSize; + + // + // Be sure that the proper amount of pages are allocated + // + GhcbBackupSize =3D (VMGEXIT_MAXIMUM_VC_COUNT - 1) * sizeof (*Ghcb); + if (GhcbBackupSize > FixedPcdGet32 (PcdOvmfSecGhcbBackupSize)) { + // + // Not enough SEC backup pages allocated. + // + VmgExitIssueAssert (SevEsData); + } + + // + // Save the active GHCB to a backup page. + // To access the correct backup page, increment the backup page poin= ter + // based on the current VcCount. + // + GhcbBackup =3D (GHCB *) FixedPcdGet32 (PcdOvmfSecGhcbBackupBase); + GhcbBackup +=3D (SevEsData->VcCount - 2); + + CopyMem (GhcbBackup, Ghcb, sizeof (*Ghcb)); + } + + VcRet =3D InternalVmgExitHandleVc (Ghcb, ExceptionType, SystemContext); + + if (GhcbBackup !=3D NULL) { + // + // Restore the active GHCB from the backup page. + // + CopyMem (Ghcb, GhcbBackup, sizeof (*Ghcb)); + } + + SevEsData->VcCount--; + + if (InterruptState) { + EnableInterrupts (); + } + + return VcRet; +} diff --git a/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c b/OvmfPkg/Librar= y/VmgExitLib/VmgExitVcHandler.c index 5149ab2bc989..ce577e4677eb 100644 --- a/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c +++ b/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c @@ -9,11 +9,14 @@ #include #include #include +#include #include #include #include #include =20 +#include "VmgExitVcHandler.h" + // // Instruction execution mode definition // @@ -126,18 +129,6 @@ UINT64 SEV_ES_INSTRUCTION_DATA *InstructionData ); =20 -// -// Per-CPU data mapping structure -// Use UINT32 for cached indicators and compare to a specific value -// so that the hypervisor can't indicate a value is cached by just -// writing random data to that area. -// -typedef struct { - UINT32 Dr7Cached; - UINT64 Dr7; -} SEV_ES_PER_CPU_DATA; - - /** Return a pointer to the contents of the specified register. =20 @@ -1546,6 +1537,7 @@ Dr7ReadExit ( =20 Performs the necessary processing to handle a #VC exception. =20 + @param[in, out] Ghcb Pointer to the GHCB @param[in, out] ExceptionType Pointer to an EFI_EXCEPTION_TYPE to be s= et as value to use on error. @param[in, out] SystemContext Pointer to EFI_SYSTEM_CONTEXT @@ -1559,14 +1551,13 @@ Dr7ReadExit ( **/ EFI_STATUS EFIAPI -VmgExitHandleVc ( +InternalVmgExitHandleVc ( + IN OUT GHCB *Ghcb, IN OUT EFI_EXCEPTION_TYPE *ExceptionType, IN OUT EFI_SYSTEM_CONTEXT SystemContext ) { - MSR_SEV_ES_GHCB_REGISTER Msr; EFI_SYSTEM_CONTEXT_X64 *Regs; - GHCB *Ghcb; NAE_EXIT NaeExit; SEV_ES_INSTRUCTION_DATA InstructionData; UINT64 ExitCode, Status; @@ -1575,12 +1566,7 @@ VmgExitHandleVc ( =20 VcRet =3D EFI_SUCCESS; =20 - Msr.GhcbPhysicalAddress =3D AsmReadMsr64 (MSR_SEV_ES_GHCB); - ASSERT (Msr.GhcbInfo.Function =3D=3D 0); - ASSERT (Msr.Ghcb !=3D 0); - Regs =3D SystemContext.SystemContextX64; - Ghcb =3D Msr.Ghcb; =20 VmgInit (Ghcb, &InterruptState); =20 @@ -1670,3 +1656,25 @@ VmgExitHandleVc ( =20 return VcRet; } + +/** + Routine to allow ASSERT from within #VC. + + @param[in, out] SevEsData Pointer to the per-CPU data + +**/ +VOID +EFIAPI +VmgExitIssueAssert ( + IN OUT SEV_ES_PER_CPU_DATA *SevEsData + ) +{ + // + // Progress will be halted, so set VcCount to allow for ASSERT output + // to be seen. + // + SevEsData->VcCount =3D 0; + + ASSERT (FALSE); + CpuDeadLoop (); +} diff --git a/OvmfPkg/PlatformPei/AmdSev.c b/OvmfPkg/PlatformPei/AmdSev.c index 954d53eba4e8..dddffdebda4b 100644 --- a/OvmfPkg/PlatformPei/AmdSev.c +++ b/OvmfPkg/PlatformPei/AmdSev.c @@ -33,12 +33,17 @@ AmdSevEsInitialize ( VOID ) { - VOID *GhcbBase; - PHYSICAL_ADDRESS GhcbBasePa; - UINTN GhcbPageCount, PageCount; - RETURN_STATUS PcdStatus, DecryptStatus; - IA32_DESCRIPTOR Gdtr; - VOID *Gdt; + UINT8 *GhcbBase; + PHYSICAL_ADDRESS GhcbBasePa; + UINTN GhcbPageCount; + UINT8 *GhcbBackupBase; + UINT8 *GhcbBackupPages; + UINTN GhcbBackupPageCount; + SEV_ES_PER_CPU_DATA *SevEsData; + UINTN PageCount; + RETURN_STATUS PcdStatus, DecryptStatus; + IA32_DESCRIPTOR Gdtr; + VOID *Gdt; =20 if (!MemEncryptSevEsIsEnabled ()) { return; @@ -84,6 +89,27 @@ AmdSevEsInitialize ( "SEV-ES is enabled, %lu GHCB pages allocated starting at 0x%p\n", (UINT64)GhcbPageCount, GhcbBase)); =20 + // + // Allocate #VC recursion backup pages. The number of backup pages neede= d is + // one less than the maximum VC count. + // + GhcbBackupPageCount =3D mMaxCpuCount * (VMGEXIT_MAXIMUM_VC_COUNT - 1); + GhcbBackupBase =3D AllocatePages (GhcbBackupPageCount); + ASSERT (GhcbBackupBase !=3D NULL); + + GhcbBackupPages =3D GhcbBackupBase; + for (PageCount =3D 1; PageCount < GhcbPageCount; PageCount +=3D 2) { + SevEsData =3D + (SEV_ES_PER_CPU_DATA *)(GhcbBase + EFI_PAGES_TO_SIZE (PageCount)); + SevEsData->GhcbBackupPages =3D GhcbBackupPages; + + GhcbBackupPages +=3D EFI_PAGE_SIZE * (VMGEXIT_MAXIMUM_VC_COUNT - 1); + } + + DEBUG ((DEBUG_INFO, + "SEV-ES is enabled, %lu GHCB backup pages allocated starting at 0x%p\n= ", + (UINT64)GhcbBackupPageCount, GhcbBackupBase)); + AsmWriteMsr64 (MSR_SEV_ES_GHCB, GhcbBasePa); =20 // --=20 2.30.0 -=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 (#69962): https://edk2.groups.io/g/devel/message/69962 Mute This Topic: https://groups.io/mt/79505943/1787277 Mute #vcs:https://edk2.groups.io/g/devel/mutehashtag/vcs 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- From nobody Sat Apr 20 08:57:17 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+69963+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+69963+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 1610045508966655.419927079784; Thu, 7 Jan 2021 10:51:48 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id WSS6YY1788612x5hsd9beBN4; Thu, 07 Jan 2021 10:51:48 -0800 X-Received: from NAM04-BN8-obe.outbound.protection.outlook.com (NAM04-BN8-obe.outbound.protection.outlook.com [40.107.100.45]) by mx.groups.io with SMTP id smtpd.web10.1174.1610045507969198554 for ; Thu, 07 Jan 2021 10:51:48 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ItwHcX++TgbuX/S3wlZZYHU+U99LSKhV++97afcPcQS0aZafW7PK6gvwM8rGA9vNLkJp9ZR4WYEgodWYbL0qN2uEatG/rIjJX0ANLTF8KS1eOVSPtNp6PH8FGFppTQzC5D1IU8ShuEeaWqgJqA6BGWelcV9wH698mtw2NP0tCVE33q9/YQcLXMaz1Z3F5xlYD+h+nNQrmeq6CeWBHniGaHwgOhAsbfw6aJIW5NRoZBQZ4IBMa3eRsx1oX1CggDz/GgEijdV2To3lzP3ug4UivbMtMjq3qMZHQcNln6nJSgFT2HzWuB0jz0dZYwvbx6FACCOIxR8awkWc3jPqTPlzjg== 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=mdmLM6cNCtI0J4G6FIYY5jcP+TMvniVf70QE2BrfEMk=; b=CCWD248GFcloDKJ5zc2Nhz0JbGtygd5OL0u1ucBAmRh0FDv/1oiLj6viGZCqOu3dlY8/SjEPZcMsj/S8+t3B+J3d1JSi6DS8JoZKQEb3ktYiLn3fqJRJMEc3vLZYViVataJyRth6uXr7sd7k/p5TXq+vLICXg46Ik7Av9nW6fYO45eOHg+pkSInLgD76zt+l7i0yHxktegEX6Jb/WDuNOIaFPqNiBquqU3rEn9KySlXX6IjYpByYf0nP9iEwOZJILuim6dQuzY6fUECjWVq1R3mtSeqWQSWxRuBlOI60oouv7q/zgbBfnWPNVhhA/BPO7r77wWc8Cgpli9GwolObCA== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR1201MB0121.namprd12.prod.outlook.com (2603:10b6:4:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.23; Thu, 7 Jan 2021 18:51:43 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:51:43 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel , Anthony Perard , Julien Grall Subject: [edk2-devel] [PATCH v3 14/15] OvmfPkg/PlatformPei: Reserve GHCB backup pages if S3 is supported Date: Thu, 7 Jan 2021 12:48:24 -0600 Message-ID: <119102a3d14caa70d81aee334a2e0f3f925e1a60.1610045305.git.thomas.lendacky@amd.com> In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SA0PR11CA0052.namprd11.prod.outlook.com (2603:10b6:806:d0::27) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by SA0PR11CA0052.namprd11.prod.outlook.com (2603:10b6:806:d0::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:51:43 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: b39fdebd-399e-4257-2a62-08d8b33d4710 X-MS-TrafficTypeDiagnostic: DM5PR1201MB0121: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:7691; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: vJatIQVtBrr2BAVJwmnf44ib9Nau03hfR/grm7F31PLaVEwV23825mL1dl3LarnFQHuAD3KzBEdqWZTvALuL1l4wFS+MNJJc52gxcQDpdiTf5sM969alNz8f2Ghn072KU7rOSUaVWAnkfAPa4RX7jOr3v+oTWksoBoQXtUhufkgbovF+qfEy0RaC6ExwmfIMsJHKs/OnKcibkn2jm7M/oOxkngtieTqzVusJt95SBjYsdNsEGGg1DQ97KDqVRy89JdiTNY89S2M9dHTnlgc1u+JzuzdVtBw1Zd55OF1aDkjdc8FNNYmKbb4YQ9HV+/kphSh2BirZ0/Exa1Raj1D1n2JeAFH0NqGv+DU5xd5AuDQavXgtgH2G+zwhaLDrgn/037aOriHZLdK4CKHBxRmIOlGBoObQGn55c5yElA5jOZBFLBfnE/A3T8h2Sp1a8yo+BsxA2gP9ZyPzwxsK8MXbdw== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?7bLUKNAv/jG+xw1jEcssC7D0g0rEciPpelZ2+saHhZztQ9XKmKyLGnJLg7DU?= =?us-ascii?Q?6pTjQ8Jxrff+Bo617vTgcSkaUG4qiWZz1PVM/OaCWu7RGYt/dpNDR89pEh/g?= =?us-ascii?Q?WjqR2+bLLyg6CInvSH+TBJq+HLhuvP0w8ndZ1VL8OULJX7E4F8CfEALqnbCp?= =?us-ascii?Q?Qp3ws3QBZBeDNCiA5/RX0GWNVavM+BGszF0pdt4H/UngiQE3AjFaXoGwq52t?= =?us-ascii?Q?+UJJb0Eh5qBpfcrjdCbTfH9Hzrpxvl/cftU2fIRdf4tjbAj4zYnRxUUT4QMv?= =?us-ascii?Q?nchutMLjWIxud/Q3Nws3AlbYGGf8C0y0IcwpqB2TLvTU+IZuI1KCLxG3Uqcn?= =?us-ascii?Q?PnzaHuSeTeuOQ0cmbZ+PJQCnClkjpi8ExsE5mgAXL8ucK5tvYjCWcH3XHBC6?= =?us-ascii?Q?L9kdHSuN4smiTpGQdCRwIGqpjT7uN2n8cImZxgRkS99Rl1WZBflmhOOQ7UVr?= =?us-ascii?Q?UsBLBhkceXS5XBFvuGc/fmXaAxVY4tuA86THImoSG/iC9Xpk/YtZ4fniI4yU?= =?us-ascii?Q?GVvXdo0CSes/kUv/GQ6bYcwQUerVCYoVWZwGjAKvPZAbvGKbnHSnxwILX456?= =?us-ascii?Q?RAVgJKq9LTEuE8XEMzFiOAQ3Qf4j4uD1LmRCP6U+hMOuNGkenNGoci49M3gt?= =?us-ascii?Q?SGCt5oWnpT+jrgHr6prN1Uaf/OavqWy4T7QvmzZbhyp31yDCs5N06WQYD4SV?= =?us-ascii?Q?od0t4aSdMAmzHFVB05ybhSkVKAFMumoVDdEzdSrLz31gmCJvbc62X+kqp3AA?= =?us-ascii?Q?KsllTWjnumKsOixDTdXP4hFqnd6gohkRIRdQ7sOiEaee0DjwbjNoxu47ftta?= =?us-ascii?Q?Sjp9V8isH9kySH0SNZoqbtP6WBmomyyFUzk5MRUog48bkyWW8wKJorRAX/4c?= =?us-ascii?Q?Upxv2b54KJGwfJrNOwWmcmRE0qxtkZn1x/U8FfnAkbzfL1cGdC/Xf2fOH83h?= =?us-ascii?Q?gXl73H7w9WCJOA4EiW6sKE5isG8qZLG+pDEDRLUovRTVNDJ/sNsO0haP9rgP?= =?us-ascii?Q?Kmpx?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:51:43.9064 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: b39fdebd-399e-4257-2a62-08d8b33d4710 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: LucfXVYOZGr+P6vf/4dD4rSlqjaV06TwSLoGxT39lp+M3srH9GKOLnigG7Yu3+nE53QiTWAZbgHR0mLjq+1BmA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR1201MB0121 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: aa1bRr9I1nicjWeoYKLCBFzUx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045508; bh=Dikn+xjEfKCwClVQd243JVuJKTR4ULCRpz1vDmCTt84=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=AcQke9bRQIZb4JZ1c9qzqrCOjpdaVlVgkkwD6q13+oyJRrxlC5DRT2yehIonNimSd0U U1i/Ek/B/ImoxvpTHsNl0bFsUjmmhgVRz+6yyt14aC7kRGpFvAIGdxbqvrvChssoMGLFK uMkk8tIIllcoy90IE4dNqE++rfVMmiVBNZc= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 Protect the GHCB backup pages used by an SEV-ES guest when S3 is supported. Regarding the lifecycle of the GHCB backup pages: PcdOvmfSecGhcbBackupBase (a) when and how it is initialized after first boot of the VM If SEV-ES is enabled, the GHCB backup pages are initialized when a nested #VC is received during the SEC phase [OvmfPkg/Library/VmgExitLib/SecVmgExitVcHandler.c]. (b) how it is protected from memory allocations during DXE If S3 and SEV-ES are enabled, then InitializeRamRegions() [OvmfPkg/PlatformPei/MemDetect.c] protects the ranges with an AcpiNVS memory allocation HOB, in PEI. If S3 is disabled, then these ranges are not protected. PEI switches to the GHCB backup pages in permanent PEI memory and DXE will use these PEI GHCB backup pages, so we don't have to preserve PcdOvmfSecGhcbBackupBase. (c) how it is protected from the OS If S3 is enabled, then (b) reserves it from the OS too. If S3 is disabled, then the range needs no protection. (d) how it is accessed on the S3 resume path It is rewritten same as in (a), which is fine because (b) reserved it. (e) how it is accessed on the warm reset path It is rewritten same as in (a). Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Anthony Perard Cc: Julien Grall Cc: Brijesh Singh Reviewed-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/PlatformPei/PlatformPei.inf | 2 ++ OvmfPkg/PlatformPei/MemDetect.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf b/OvmfPkg/PlatformPei/Plat= formPei.inf index c53be2f4925c..6ef77ba7bb21 100644 --- a/OvmfPkg/PlatformPei/PlatformPei.inf +++ b/OvmfPkg/PlatformPei/PlatformPei.inf @@ -118,6 +118,8 @@ [FixedPcd] gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupSize gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize =20 diff --git a/OvmfPkg/PlatformPei/MemDetect.c b/OvmfPkg/PlatformPei/MemDetec= t.c index ffbbef891a11..c08aa2e45a53 100644 --- a/OvmfPkg/PlatformPei/MemDetect.c +++ b/OvmfPkg/PlatformPei/MemDetect.c @@ -888,6 +888,11 @@ InitializeRamRegions ( (UINT64)(UINTN) PcdGet32 (PcdOvmfSecGhcbSize), EfiACPIMemoryNVS ); + BuildMemoryAllocationHob ( + (EFI_PHYSICAL_ADDRESS)(UINTN) PcdGet32 (PcdOvmfSecGhcbBackupBase), + (UINT64)(UINTN) PcdGet32 (PcdOvmfSecGhcbBackupSize), + EfiACPIMemoryNVS + ); } #endif } --=20 2.30.0 -=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 (#69963): https://edk2.groups.io/g/devel/message/69963 Mute This Topic: https://groups.io/mt/79505947/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- From nobody Sat Apr 20 08:57:17 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+69964+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+69964+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 1610045517382796.323060945464; Thu, 7 Jan 2021 10:51:57 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id nLGBYY1788612xRzmYneJWpy; Thu, 07 Jan 2021 10:51:56 -0800 X-Received: from NAM12-BN8-obe.outbound.protection.outlook.com (NAM12-BN8-obe.outbound.protection.outlook.com [40.107.237.74]) by mx.groups.io with SMTP id smtpd.web10.1177.1610045513516164514 for ; Thu, 07 Jan 2021 10:51:53 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lOyI8WmzgarkhsYStq8ewpytHp8IxFHnpBW072hsBOKga/loNmDkFQllPehm6TqWx76ALne1JjAVi+h8W5peUz5VtViIFUJVqWh0s2CtBsvMyB/1aEBCIqMHQOyXHxpHmGL9UfM49P61/fqJqiNUoUiGQhl+5KVNRF47gsk/yr1KdqbABUR6Lb7pctMsyTbQpHWV2/peKzhKGoTrQDxO3BbGhZaXB7JeRySonHV3ZyQ9ngq8N8YVmf+NxaOphqwNmWUj7aLzwPL7ovmuRSvrtO6BIh58j7oi4PQSSi1hMFZfIox6MH7JjW1J3dzeQXYFpN9aQnVaRl5KNu4QP29Uqw== 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=g0jJGCLWbaS71xsnMvQjLxVO5/5Hug1e4WlzEU8SkCo=; b=XIRPHiJ9dH/H/IGDJOKmBAuLXxN26Eq3nESFgBOL3LKeziWYCcuaSe7lOC76ln/oQKulUM0F7/Iw1aO2ffQqjf+b8A43H+DOqNmJnpTpU7bXZP1A6x0SPsPgdjJu3Szw0bkkmEgf5Ux+IS2m2Je5UJTq96C4RHUOHxkGB1/6dIQA4zTrwIFYHvlfTqTIyiK0tqTO/s5zeYnEgiBlXyckZykvAY6d+fsBrpG5EE1+z4qmhdkXw4RCUvnDmDV7A2GXMnFZrqpN2po1wGkjN/jf7rF3ce0ms5t6oo4avPtuTaqbI1kj9AQzzQ2SnM21HSAtIHukEKSn3wtBibFl4fN6Jg== 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 DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM6PR12MB4987.namprd12.prod.outlook.com (2603:10b6:5:163::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6; Thu, 7 Jan 2021 18:51:51 +0000 X-Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::d95e:b9d:1d6a:e845%12]) with mapi id 15.20.3721.024; Thu, 7 Jan 2021 18:51:51 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , James Bottomley , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [edk2-devel] [PATCH v3 15/15] OvfmPkg/VmgExitLib: Validate #VC MMIO is to un-encrypted memory Date: Thu, 7 Jan 2021 12:48:25 -0600 Message-ID: <0cf28470ad5e694af45f7f0b35296628f819567d.1610045305.git.thomas.lendacky@amd.com> In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SA0PR11CA0037.namprd11.prod.outlook.com (2603:10b6:806:d0::12) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from tlendack-t1.amd.com (165.204.77.1) by SA0PR11CA0037.namprd11.prod.outlook.com (2603:10b6:806:d0::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3742.6 via Frontend Transport; Thu, 7 Jan 2021 18:51:51 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: f06ac571-6422-4cb6-4c91-08d8b33d4bbd X-MS-TrafficTypeDiagnostic: DM6PR12MB4987: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8882; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: CM9RriTMe8wT1lH7erO715QqR1mpDuth0TACCsRNpeIR8oLdRIm46ZgQIuQ05p48JrTpGQ0oiNwbd4tikDGwAZF1mAzmoNHV6cLQ+/CN+lDkLKEPvIG+GTMD3IqsCq03vtOPIwABMcfLjPhzlhZMyH9cIevOAGZKVaCChYtBXyMSzcVbVMDmPunABFFeoXa2rajh+pztXyUTZ1TxIUNveq36+GLiPaNMpDpxpO2YuATL2SMi7LmVytiHcYog39Kc4nKQVs2T9HtyRYkxOKLzIkp3kqRZXjzoiVWztQs/Y7XROIil2xLnnAh3tUY7LGKyPyVJTs9b9LhsfnthcIt1kUaGjAAuZVrU1eKkUQZ3ybDopKtkOBs9n2KqLDbSFvFg2gz9DPaL87F4iGenbuuFwbWpQkOww62fDAO4iqYXut2Y0zR6U0lnW4IvPBneaVhvIx+yzCjBDr7Z6IlyPZvFCA== X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?suUP/AbYZeBVZRXrcC5e4fF4iAhfPOiCThvYmahoiIoUjZUjDKeog0skQvTp?= =?us-ascii?Q?RTh1jgfdFxAzUDBUuZknCIS/Kr0PW6xK12oOf8cudR4JXl52y3uO6SbXAAd3?= =?us-ascii?Q?6mUxM7kXCjrkkjUHIgME9rIgVOBQOrkXrI9ZRMhAUeorJwM/SGyvps5SRZR1?= =?us-ascii?Q?2gmaOgXCMw1i2PF5ipYL0hMrSGGg6nErYQ9/Zdu7wG4UDN1mRNFPRKpz3WX7?= =?us-ascii?Q?/6HTETZBb/6i3qbX+i0YfAFUmRf7dlC8pnaTDgORbapI6JCjIWA2K1VXixTQ?= =?us-ascii?Q?WkwZX/P/tPS0go6Qa3FaZF1l/POvs55NAMf6Dtx1lXRK8yFr9X/LulmMwI5+?= =?us-ascii?Q?3T/cpI3w+usH2tCdaQ/5AJ9y1oLd97gMSSbSu+kK3LL1GFnL0cJRsHAtEMA8?= =?us-ascii?Q?xdc8TjCDe9ACDl7o+XNfjyxuJjPFf+AsiUz1S26aYjaVZe8R3GTX1FftU3Y+?= =?us-ascii?Q?JicPTdbiPpN8g7LP9ts3drvO5bKgxC4cPASUm5JX3EdCg0p4ulZJ7fdEbszR?= =?us-ascii?Q?6+xN6ihcOIUVMLBvWkEid2NNynrFTIQl1tPfuZ1VW125L4NrVCFS4/zBdlao?= =?us-ascii?Q?T3SGkr9WV+JFPU0wHdBETFeJcAb3O04o5mPKCxVPulYe4DNoa0NuqfqQ4bEw?= =?us-ascii?Q?JE5gT5qm3/byUm1iIx11U8Oi6YACEiP4xLSTetHzc5q433t5Pc877vcYemM1?= =?us-ascii?Q?3rzOTenx90HG0riCXYxudR97zywlZXbtipO43ZkseEkbteInwHvdR+lMzghW?= =?us-ascii?Q?GdbSwAf2xu6TdX7XMF9GjBk86nLgjKHKFzoxIXU9oWlZw1LN9bNJ7xRcTaRR?= =?us-ascii?Q?U7t59ttf30TGwsx2duy2nHx7nonMvlqdqfczz6aqL44ASkVw+0SWrSs9Wmz1?= =?us-ascii?Q?o+OAelRF3U5PuFzOzNDWp92NKn9VoUNcPhk0hTiOlOYIYb11KzfwLDPbQ86r?= =?us-ascii?Q?JkUmumMIO3Nv02usm4L3qeXEGvPf7fEGV8AzSgOVj/1NS/+fL1nIJOVA7w+j?= =?us-ascii?Q?i4Qb?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2021 18:51:51.7269 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: f06ac571-6422-4cb6-4c91-08d8b33d4bbd X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: xsBUfIwGxHKOGWpHRvL36uPlPrC/Hh4h5pHSZxO+X1SwRjoh8VwUa8l5ectPSPyOoqMVrFkEwVORkkto67UNLA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4987 Precedence: Bulk List-Unsubscribe: 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,thomas.lendacky@amd.com X-Gm-Message-State: bjeV7cb6WFote8zaSOKpTjsfx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1610045516; bh=4imSM1tMRlj3zyfl4jKJx6aifI/8heuqJ6hdMSoQp1I=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=ZtTCtumVTC/310qMfqIhfzsWOKE83OumIGjJik7KLhnYxBu9gVSa9w+O8StwdHUvU8T 6XNHH9kf5Vp0H6aF3nneCQ4wi6R9CRRRMpuKOuAOW5C2WRMywmwga2Z0JVqcnBsB3YhjI DT/5evq5TjrOfNU/7eiaVUqe/h50RDR/1TI= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3108 When SEV-ES is active, and MMIO operation will trigger a #VC and the VmgExitLib exception handler will process this MMIO operation. A malicious hypervisor could try to extract information from encrypted memory by setting a reserved bit in the guests nested page tables for a non-MMIO area. This can result in the encrypted data being copied into the GHCB shared buffer area and accessed by the hypervisor. Prevent this by ensuring that the MMIO source/destination is un-encrypted memory. For the APIC register space, access is allowed in general. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Brijesh Singh Acked-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/AmdSev/AmdSevX64.dsc | 1 + OvmfPkg/OvmfPkgX64.dsc | 1 + OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf | 2 +- OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf | 2 + OvmfPkg/Library/VmgExitLib/VmgExitLib.inf | 2 + OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c | 81 ++++++++= ++++++++++++ 6 files changed, 88 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc index c4d93f39b9f1..dad8635c3388 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.dsc +++ b/OvmfPkg/AmdSev/AmdSevX64.dsc @@ -237,6 +237,7 @@ [LibraryClasses.common.SEC] CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiC= puExceptionHandlerLib.inf !endif VmgExitLib|OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLi= b.inf =20 [LibraryClasses.common.PEI_CORE] HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index bfa9dd7cac1f..70ff2bcf2342 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -266,6 +266,7 @@ [LibraryClasses.common.SEC] CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiC= puExceptionHandlerLib.inf !endif VmgExitLib|OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf + MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLi= b.inf =20 [LibraryClasses.common.PEI_CORE] HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf b= /OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf index 8e3b8ddd5a95..f2e162d68076 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf @@ -14,7 +14,7 @@ [Defines] FILE_GUID =3D c1594631-3888-4be4-949f-9c630dbc842b MODULE_TYPE =3D BASE VERSION_STRING =3D 1.0 - LIBRARY_CLASS =3D MemEncryptSevLib|DXE_DRIVER DXE_RUNTI= ME_DRIVER DXE_SMM_DRIVER UEFI_DRIVER + LIBRARY_CLASS =3D MemEncryptSevLib|DXE_CORE DXE_DRIVER = DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_DRIVER =20 # # The following information is for reference only and not required by the = build diff --git a/OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf b/OvmfPkg/Library= /VmgExitLib/SecVmgExitLib.inf index df14de3c21bc..e6f6ea7972fd 100644 --- a/OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf +++ b/OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf @@ -35,6 +35,8 @@ [LibraryClasses] BaseLib BaseMemoryLib DebugLib + LocalApicLib + MemEncryptSevLib PcdLib =20 [FixedPcd] diff --git a/OvmfPkg/Library/VmgExitLib/VmgExitLib.inf b/OvmfPkg/Library/Vm= gExitLib/VmgExitLib.inf index b3c3e56ecff8..c66c68726cdb 100644 --- a/OvmfPkg/Library/VmgExitLib/VmgExitLib.inf +++ b/OvmfPkg/Library/VmgExitLib/VmgExitLib.inf @@ -35,4 +35,6 @@ [LibraryClasses] BaseLib BaseMemoryLib DebugLib + LocalApicLib + MemEncryptSevLib =20 diff --git a/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c b/OvmfPkg/Librar= y/VmgExitLib/VmgExitVcHandler.c index ce577e4677eb..24259060fd65 100644 --- a/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c +++ b/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -595,6 +596,61 @@ UnsupportedExit ( return Status; } =20 +/** + Validate that the MMIO memory access is not to encrypted memory. + + Examine the pagetable entry for the memory specified. MMIO should not be + performed against encrypted memory. MMIO to the APIC page is always allo= wed. + + @param[in] Ghcb Pointer to the Guest-Hypervisor Communication = Block + @param[in] MemoryAddress Memory address to validate + @param[in] MemoryLength Memory length to validate + + @retval 0 Memory is not encrypted + @return New exception value to propogate + +**/ +STATIC +UINT64 +ValidateMmioMemory ( + IN GHCB *Ghcb, + IN UINTN MemoryAddress, + IN UINTN MemoryLength + ) +{ + MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE State; + GHCB_EVENT_INJECTION GpEvent; + UINTN Address; + + // + // Allow APIC accesses (which will have the encryption bit set during + // SEC and PEI phases). + // + Address =3D MemoryAddress & ~(SIZE_4KB - 1); + if (Address =3D=3D GetLocalApicBaseAddress ()) { + return 0; + } + + State =3D MemEncryptSevGetAddressRangeState ( + 0, + MemoryAddress, + MemoryLength + ); + if (State =3D=3D MemEncryptSevAddressRangeUnencrypted) { + return 0; + } + + // + // Any state other than unencrypted is an error, issue a #GP. + // + GpEvent.Uint64 =3D 0; + GpEvent.Elements.Vector =3D GP_EXCEPTION; + GpEvent.Elements.Type =3D GHCB_EVENT_INJECTION_TYPE_EXCEPTION; + GpEvent.Elements.Valid =3D 1; + + return GpEvent.Uint64; +} + /** Handle an MMIO event. =20 @@ -653,6 +709,11 @@ MmioExit ( return UnsupportedExit (Ghcb, Regs, InstructionData); } =20 + Status =3D ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Byte= s); + if (Status !=3D 0) { + return Status; + } + ExitInfo1 =3D InstructionData->Ext.RmData; ExitInfo2 =3D Bytes; CopyMem (Ghcb->SharedBuffer, &InstructionData->Ext.RegData, Bytes); @@ -683,6 +744,11 @@ MmioExit ( InstructionData->ImmediateSize =3D Bytes; InstructionData->End +=3D Bytes; =20 + Status =3D ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Byte= s); + if (Status !=3D 0) { + return Status; + } + ExitInfo1 =3D InstructionData->Ext.RmData; ExitInfo2 =3D Bytes; CopyMem (Ghcb->SharedBuffer, InstructionData->Immediate, Bytes); @@ -717,6 +783,11 @@ MmioExit ( return UnsupportedExit (Ghcb, Regs, InstructionData); } =20 + Status =3D ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Byte= s); + if (Status !=3D 0) { + return Status; + } + ExitInfo1 =3D InstructionData->Ext.RmData; ExitInfo2 =3D Bytes; =20 @@ -748,6 +819,11 @@ MmioExit ( case 0xB7: Bytes =3D (Bytes !=3D 0) ? Bytes : 2; =20 + Status =3D ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Byte= s); + if (Status !=3D 0) { + return Status; + } + ExitInfo1 =3D InstructionData->Ext.RmData; ExitInfo2 =3D Bytes; =20 @@ -774,6 +850,11 @@ MmioExit ( case 0xBF: Bytes =3D (Bytes !=3D 0) ? Bytes : 2; =20 + Status =3D ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Byte= s); + if (Status !=3D 0) { + return Status; + } + ExitInfo1 =3D InstructionData->Ext.RmData; ExitInfo2 =3D Bytes; =20 --=20 2.30.0 -=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 (#69964): https://edk2.groups.io/g/devel/message/69964 Mute This Topic: https://groups.io/mt/79505948/1787277 Mute #vc:https://edk2.groups.io/g/devel/mutehashtag/vc 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-