From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0627.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe40::627]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 17D2921969FA6 for ; Mon, 22 May 2017 08:23:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=cBas6R1tt3/sSqIT3C72M3UrO6pEZocOlfDpdgr0AyY=; b=1wQWivTQdV8kAm32G39orYV6l0RjRJdj99yyBKTemYFTMwBqT0oqG7av1qvDThGzvjLREvjhrFpYlQIeHwoeB8WVl+zS0l+DtT0PYVnPHNjvI7bDIJl/EZfXvBwHbzKZxD7DpP/xQ/IZOI/rgMDWERzr74Xcfbd/PDUfDHAdtps= Authentication-Results: lists.01.org; dkim=none (message not signed) header.d=none;lists.01.org; dmarc=none action=none header.from=amd.com; Received: from brijesh-build-machine.amd.com (165.204.77.1) by DM2PR12MB0155.namprd12.prod.outlook.com (2a01:111:e400:50ce::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1101.14; Mon, 22 May 2017 15:23:45 +0000 From: Brijesh Singh To: , , CC: , , Brijesh Singh Date: Mon, 22 May 2017 11:23:10 -0400 Message-ID: <1495466592-21641-13-git-send-email-brijesh.singh@amd.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1495466592-21641-1-git-send-email-brijesh.singh@amd.com> References: <1495466592-21641-1-git-send-email-brijesh.singh@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: BN6PR17CA0030.namprd17.prod.outlook.com (2603:10b6:404:123::16) To DM2PR12MB0155.namprd12.prod.outlook.com (2a01:111:e400:50ce::18) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM2PR12MB0155: X-MS-Office365-Filtering-Correlation-Id: 11fd566a-e1d5-43cd-5f51-08d4a12689a9 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(48565401081)(201703131423075)(201703031133081); SRVR:DM2PR12MB0155; X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0155; 3:Ai3LYhrks0qpyBFmFisCDTG4tp9m7a08fGqPAomZj+IZOzooAQKqIvagHQ019gmFRNC5bI/bx1f2MywDU6XjHhDb0eMMhynqyNoX14SnFyyqxuO9vO3uJMN+kf/KI3DyPvTvrS7ljnu/pTBi4Ikp32GCYXrIbnIkBam8TgI61P0ykSsc6u/ZW9CGvQiW4GmmGbwdJqu19qvJAoI7xtUFMhN3TWDkIdYNQdJZs3gYfnGUDaQv3pDlvUEAFEvH1ddKhoJMzCt5w6ia3vBc96bYexWmbDa48mBrT1v6Uillv0tjsSwOIzUweajysM1Op/DL4IRnPgloi2J1MlsNfZz+69XpEPAWUTJts1CTpsnCCEw=; 25:vqmcgqV6OAGjYG0DixiMI8NbJ1PQ88Ajd7znUM0OP0KhLNRZoJjY1QKxVaJxoyW9xftMTV13u+8ilB+bLYHTMEy1F5E3yTQbNfAdiiMKhhBY1WISECDw8Jv6rUxWcfjyKHA96aQPuOF88inqhUCPGZyk+NS/5Gq0aGxhnUmLW5oX/kGqWAWdBA2tTfk7dpwW7bHtwdhdAiwg1CVaQWjqIZSgimRQb4nJZQXZ6QrXGnO4cZVhZJz9bAR6z3pu8Tp5hDzUfOpqg/aQYwYyMpuIlgOxW0cc4hqknBiWcc+YswBjzyTduXgJ01+OgNU1saYLL1sMUf0nOOgP1gjpAGOiXhpscEL2rXVXr2T4Muxcg0fi5N62FC3wVGrY39C+xYZGaPAvh6luxwaNhgdGElk9ZIEkV3NUZ+mSHPOncdmbDzYryT2w6JHs/kNIKqMGlCX/15UEW4FG/bNiO3tLHooKzR/7E2xAjcM3S8ZsxA446RU= X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0155; 31:bT+qXVH8XtTplIM06nnW9dms2HA1d2+8gVEii4w7p80in9f6FiSWfNABKDvvFXOhaJxWqsZO7U+4yaAXI0dWZU2sDfoLz7vni7jAGXsEN3nqGbGa5AtT9TMeg88t3mXCCVWp6K5Ey9Kyl5Yz4qjh2EvXfiSu/BFZElfo/ScAhC9PyVG+FZME0oRmdvQ7fln3puXQeiv6uKD14Nmz9QFHe6+ieZIXwqb47J3ShP7qiYM=; 20:zyieOuQKON7CvewZfJ/CYaTX599270znnKqJURgMhqHEU0V4vZ5lV3zRtIR0vur06PI666bA4qruvu9YdnEiTw4GU4zYmnRZqOfI1zjtuwBXibzM6v6doAgE9GOCC223dNNAdwB0VdkvtZA6KQsTa2H+19Bq3nvUCXe+hyTuGJwcKTqlks1dzS9VN3q4ywU9XnzfvKL4DkjRA/SDGGZ3AG5dPNStKjBHkYr7lOid/V6VnLLZEfyAzaU60YGpyImcAVw8TwAaw20wdeX90GuDCAE69TJNCrJyU8tg9qkkcny01OHQwSHMaMLSwtg++Gaz3jAoZGU0v81PFlYVNiWOuJry7h6BPGAcrEGs2LSJEfiKciYa+Sk0l42mPM8ZOqXgH6/r6RXN2HwdxRM/1NfvKAMs9V7ZKz1XOT7KEj1JC6hwrtn3var2UA81/R6Gusi1F6oK6ooNVRbVtE1/2eti2YMZCsSJ1kr76wKPCulKUeCSShinldvUuf+8ZQ79Bcmz X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110)(228905959029699); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(93001095)(10201501046)(3002001)(6055026)(6041248)(20161123558100)(20161123560025)(20161123555025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(6072148); SRVR:DM2PR12MB0155; BCL:0; PCL:0; RULEID:; SRVR:DM2PR12MB0155; X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0155; 4:QGKVaGKPwpJ/2+ub2m+CgokkMt50yizl02q5GCt3tXT3pr1iY9mF7JV588oaAaCI6g1RRV869w9s3MtfrB+b+btEbSxy/O+2HI1xGDfhcAOKC8ZIXBb3tSS0S9IXpvfRPu7oSYV1NG2OluW8R+ZYQbr81YEc/rvrYR3jMdhV/nXrqeYoQodf1ufOAxaePXSfpRARI0KDb/bLeaE13Kq+DtCJhq5wKsLHZAsPuq8IN932Jw1cGbUz0nk0u/kqyksgxp4btqSSCcUiG7Nr60+DGYl/To27fK7ICuBglg9U3KGaIW34CiJcwhNitRCAHHIRnS3/F9/eVURpohVqKltzmTj9W2/t5J1f0DpI3Y1yxY6Z2w9cq56lr3YlmJr/0dgLP4kUX86yIXFjS8guWh5bTpwUy3mmY0CnpX/v/yAx7D1iVxgrXbm1giWcd2z2468SOurGS3l47VL/R2EoOJ1qShebo07cKX5j+8GtN3LjY92FbYFm4rt2FrdqsS+x4rLpInastmQJxzPFHGJvUjHhjWL4aHqKaE9WWjT1GOxpoAXPzyW6pq0ultqc3LC4KV4d7urMFvUHzkn0e7IrkGLsGiVrA3w+F2rziX+tVfCuSvpFDBVtR2b6TpRmByANY46hrzMWJ6f9WPhKZHeUemEVd+gUfBC+zouMh0EuOT3HR4Xah8sDZf3F6H6nT9jAiJ3hOpsJVouzsTRSKlv2gFss/oxmuFGae3Bs2SpnF/Po3q4LpYkfTphQzK2Wrb62xJs85Mw+ODwDnnDTUmKNM8aXEqZc6joo983KwNq4NW+Wne1is9NlIlYc4gOGJGvEkRWvw69z4J8ryLEZXp5V+5mQ8fl5HnlCMxGkNP1Ci+qcKqSVYFQp87hx/DuwwSSl375z X-Forefront-PRVS: 03152A99FF X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(39840400002)(39860400002)(39850400002)(39450400003)(39410400002)(39400400002)(6486002)(5003940100001)(54906002)(6666003)(2950100002)(36756003)(53416004)(42186005)(86362001)(47776003)(2201001)(66066001)(2906002)(5660300001)(305945005)(7736002)(50226002)(38730400002)(3846002)(6116002)(189998001)(8676002)(76176999)(81166006)(53936002)(50986999)(33646002)(4326008)(478600001)(48376002)(50466002)(25786009); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR12MB0155; H:brijesh-build-machine.amd.com; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR12MB0155; 23:61ByLpHg+MWL5UUkhUY1abeGkKNhnSwKmws/SpCtA?= =?us-ascii?Q?ivu8Cq+O6ylpr1JDCTYuD6W8kNDVjxJKOVK/JzgiRgFDiqM610xrcrXFFRfj?= =?us-ascii?Q?ANZ7N3LEAaH0a7r9v7ywjwTRGzcEtMxvJ/L7TbMbt/15pnjX05eqS8sKTg2U?= =?us-ascii?Q?Ps2wZaksJaC9teFrO04WZ9E/WrlKM7DFRDQ/vo/oezSEBgi+UwPTKWXbA7yr?= =?us-ascii?Q?1vhtEXglRHmMNs1SIy6CeweXpewKs7T3pEDgwTt0pbUk9+RXcdQUlBCYRUae?= =?us-ascii?Q?prXkpihx+v98YxWzpAgL65F6uh8gCnFhXsyWmdcf6nRhont00wFRXigzc5AI?= =?us-ascii?Q?KQroYhCi/TuWS9V+RW5K/mHn6N+WOq32Pbfl6EOwI3aFhZUXYNUfmCqHoZFz?= =?us-ascii?Q?boeYDBD4QScJaLuJVKID+OyGxx/h13pxXp+u0qFCH2PNY8dt/WBF7FISM9hH?= =?us-ascii?Q?4WTrf2toD8d1sfbdUUIMVuWW2c2mI/DU1+OcTSwDb/AKRb6qEANkLCQPpdTu?= =?us-ascii?Q?Xz3YnQmC8WX3yRGkO6E9hqzq7y7YmEiFCwV6kVBD5gZRTW8uI41o2Wqlg1D1?= =?us-ascii?Q?FYSJM/hSYczWsBnbGjkQmfrYWtMzl+CZtdf9pS9BEr1bCqEld2LPFKivVVZf?= =?us-ascii?Q?qRmkdAHSmBv+NHH8KqrrGSJyK29BuejhWAyTOx6jGPZwF9Ja+kfYuDkQXBN8?= =?us-ascii?Q?/5/m4wSLmM65kwgV/pjgTEYZ1DR/FjN2ncx+xx3L7wo14upfwNleyKgg5T6U?= =?us-ascii?Q?C2jlC3RQaPlRf4A82SIQtawdJhvSKdxi+hc8gMLJf53/mssfYJjt1r82koBn?= =?us-ascii?Q?lpQowoR3T7OJZvkFT213Eh9tQ67vRtTcr/u0D0dguKnirMw5VTaHFwIJYx8n?= =?us-ascii?Q?ZW0FY9Xb43VHKxqhDP6jw8mW8lbuA/unQM8cTMEbwPl9w7quPdMMOoWJ3k3f?= =?us-ascii?Q?N4WiVqP+cDvkqLyTKMJMVdy6ZdBQd78KBkg8K4fcgiz7dL8TV2yrh0+UrwzK?= =?us-ascii?Q?wdW2N5aMC+fxtq6iMI8LnHprYQsH6yxyQZGIh3/QqMr2A=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0155; 6:KT8+WiK6sH5XnC/+S/5Kmezg6j0pi3qL6LTT3gUuNzwteven51+FvIiVxHYu3ik4x8V4Z9/nmOl0nmvFZxi0LydJuBqK3iXFhd+22K//ZHczanrznWbCAkVEpPRUwlHBunZX6VSrzVWanqlnCs1wLFKSM5TUZhYifsMSp1YzEvyAVd3I/UGbujIr4m6Ot4WmyYrn9E8ToKrL1FW+kUyXFzo67tKWl2q84hmOkxx/JqsK5aP+7WbU7kHWNbs0ScYUNwlEUoMmp91fS5Lasl4KarrNPAdRZsaoBAoDJSbzHuZURvCfMDXulxV1WCLobpWXWa6KZQvAf+yot9HF2NDa+PwJM9pmd3SGQfWnAnQi5Ft7V6YZsmWSCyvEAKzRFDqxZd0Jj7H6c+gUa2RzJq4Gxk0uu6LnkggDBWo1hFCM2NB6zWlxJ+tpcHdcumLsKSw3xTv1TzO9dzphtx+Jq7kM9o0Q5Tb1d1O0aPqgyejJn5VMo/DeEs/ojR2dTjjA6U4QA2CjVaLheUFMrkAlQJ8BdbcVjDptLEQOGUt/6k3DRRM=; 5:qvC6Cl+xKPjHYPLiPhKweCb3E8UqKTKPDFGtLtLSE+homXW4uIraZ2YUZvW36a3IgT+8R0eq0t2V0XsLVR7bR4T9MlQNhu0kg6hVNU+Ooug/ggSSj3Ol0x0v023l+jBqMr3AJ1ihm/YbwT2PW317Lw==; 24:yvZHjnSBuPregLkMIbahjAslcCjtTjc9Y4QIGB2ymEJ+UYgyQQFgHmhlxm7paybcmuvKlpwuVSoyKFKP3ad1yGz8vaviBoJvzi+6ecYCtCU= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0155; 7:R4Ha2wTro1D5Zcv1l1DokmJey68svzdngOk7W9wPpJB5j5LVrgt2yHwBKxX/wWqWhpJ8e/U3S3vvidML5JtgZl8YJ8V8fkGe5rOKBgQPXI+N4aLlsNc7qSfOmr2no8wln6kZGvTzZEHpQjSm0rGLl+VsmnLtfS07GegHba1Bprbj4jWDxiGMmRX0rCzy79UCkAuThBD10TX8wvAUyr6HZN2PXyzBiHAGl+/QsvavJef3XI4V1sGrYSJY/OOwf5ypkpl37RQ0RrQZ2WpORTxESu9YXSTZTt/YN5UIKU48gxz36ZWtj+HD0dVZQ0LWc/QfBH6bog4eZlfJZnlpqdCCug==; 20:qF2Rm7jjKxZoWbXr5l9qJRyd54kx82B7gzaMM3hjCcwFcLb3d9i23CsydNYbJV90IAtvZDuVi+owYy3xftvgrX7DVwaRdmzMbtdK7JTsUcH1391rEyqHr2cdOuvRhV+GQwwV62fUw/AR5wrE58Xx7NtDWKaNbq1SzQKnHnFuNHgR1Juu+9inxFPkl7YDEprkMoeScMZkycGivU0U/U4c+ZRQZtgZp3C362xE4FGE6fQghUfNaBQ49iTsWF1UukEv X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 May 2017 15:23:45.0240 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR12MB0155 Subject: [PATCH v5 12/14] OvmfPkg/QemuFwCfgLib: Implement SEV internal function for Dxe phase X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 22 May 2017 15:23:47 -0000 Content-Type: text/plain When SEV is enabled, the DMA must be performed on unencrypted pages. So when get asked to perfom FWCFG DMA read or write, we allocate a intermediate (bounce buffer) unencrypted buffer and use this buffer for DMA read or write. Cc: Jordan Justen Cc: Laszlo Ersek Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Brijesh Singh --- OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf | 7 ++ OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxe.c | 108 ++++++++++++++++++++ 2 files changed, 115 insertions(+) diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf index d7e368e5435d..ec128f82c702 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf @@ -39,6 +39,7 @@ [Sources] [Packages] MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec OvmfPkg/OvmfPkg.dec [LibraryClasses] @@ -47,4 +48,10 @@ [LibraryClasses] DebugLib IoLib MemoryAllocationLib + MemEncryptSevLib +[Protocols] + gEdkiiIoMmuProtocolGuid ## SOMETIMES_CONSUMES + +[Depex] + gEdkiiIoMmuProtocolGuid OR gIoMmuDetectedProtocolGuid diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxe.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxe.c index ac05f4c347f3..bda1a80b5eb9 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxe.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxe.c @@ -4,6 +4,7 @@ Copyright (C) 2013, Red Hat, Inc. Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.
+ Copyright (c) 2017, Advanced Micro Devices. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this @@ -14,14 +15,36 @@ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ +#include + +#include + +#include #include #include +#include +#include #include "QemuFwCfgLibInternal.h" STATIC BOOLEAN mQemuFwCfgSupported = FALSE; STATIC BOOLEAN mQemuFwCfgDmaSupported; +STATIC EDKII_IOMMU_PROTOCOL *mIoMmuProtocol; +/** + + Returns a boolean indicating whether SEV is enabled + + @retval TRUE SEV is enabled + @retval FALSE SEV is disabled +**/ +BOOLEAN +InternalQemuFwCfgSevIsEnabled ( + VOID + ) +{ + return MemEncryptSevIsEnabled (); +} /** Returns a boolean indicating if the firmware configuration interface @@ -79,6 +102,22 @@ QemuFwCfgInitialize ( mQemuFwCfgDmaSupported = TRUE; DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n")); } + + if (mQemuFwCfgDmaSupported && MemEncryptSevIsEnabled ()) { + EFI_STATUS Status; + + // + // IoMmuDxe driver must have installed the IOMMU protocol. If we are not + // able to locate the protocol then something must have gone wrong. + // + Status = gBS->LocateProtocol (&gEdkiiIoMmuProtocolGuid, NULL, (VOID **)&mIoMmuProtocol); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "QemuwCfgSevDma: failed to locate IOMMU protocol\n")); + ASSERT (FALSE); + CpuDeadLoop (); + } + } + return RETURN_SUCCESS; } @@ -114,3 +153,72 @@ InternalQemuFwCfgDmaIsAvailable ( { return mQemuFwCfgDmaSupported; } + +/** + Allocate a bounce buffer for SEV DMA. + + @param[in] NumPage Number of pages. + @param[out] Buffer Allocated DMA Buffer pointer + +**/ +VOID +InternalQemuFwCfgSevDmaAllocateBuffer ( + OUT VOID **Buffer, + IN UINT32 NumPages + ) +{ + EFI_STATUS Status; + + ASSERT (mIoMmuProtocol != NULL); + + Status = mIoMmuProtocol->AllocateBuffer ( + mIoMmuProtocol, + 0, + EfiBootServicesData, + NumPages, + Buffer, + EDKII_IOMMU_ATTRIBUTE_MEMORY_CACHED + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a:%a failed to allocate %u pages\n", gEfiCallerBaseName, + __FUNCTION__, NumPages)); + ASSERT (FALSE); + CpuDeadLoop (); + } + + DEBUG ((DEBUG_VERBOSE, "%a:%a buffer 0x%Lx Pages %u\n", gEfiCallerBaseName, + __FUNCTION__, (UINT64)(UINTN)Buffer, NumPages)); +} + +/** + Free the DMA buffer allocated using InternalQemuFwCfgSevDmaAllocateBuffer + + @param[in] NumPage Number of pages. + @param[in] Buffer DMA Buffer pointer + +**/ +VOID +InternalQemuFwCfgSevDmaFreeBuffer ( + IN VOID *Buffer, + IN UINT32 NumPages + ) +{ + EFI_STATUS Status; + + ASSERT (mIoMmuProtocol != NULL); + + Status = mIoMmuProtocol->FreeBuffer ( + mIoMmuProtocol, + NumPages, + Buffer + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a:%a failed to free buffer 0x%Lx pages %u\n", + gEfiCallerBaseName, __FUNCTION__, (UINT64)(UINTN)Buffer, NumPages)); + ASSERT (FALSE); + CpuDeadLoop (); + } + + DEBUG ((DEBUG_VERBOSE, "%a:%a buffer 0x%Lx Pages %u\n", gEfiCallerBaseName, + __FUNCTION__, (UINT64)(UINTN)Buffer, NumPages)); +} -- 2.7.4