From patchwork Tue Jun 27 15:11:53 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Lendacky X-Patchwork-Id: 9812465 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 886FD60351 for ; Tue, 27 Jun 2017 15:14:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 77D3E27FAD for ; Tue, 27 Jun 2017 15:14:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 69532286CA; Tue, 27 Jun 2017 15:14:39 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6369C27FAD for ; Tue, 27 Jun 2017 15:14:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753278AbdF0POe (ORCPT ); Tue, 27 Jun 2017 11:14:34 -0400 Received: from mail-co1nam03on0077.outbound.protection.outlook.com ([104.47.40.77]:27211 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753308AbdF0PMY (ORCPT ); Tue, 27 Jun 2017 11:12:24 -0400 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=UvmsxGsmigxJvVqDA+y3G3zFQc5sTTorU0kKlJ5j+Z8=; b=qQu21D0HZPCx09fKfRZhpbkRkA/HHWKldRX9IFFUqJ9N08DtLXl2WOZ7Zepbwf+mo1P3dx8hfQWVOOreuJFbNdTyhUx4MoGKbZe/Zm1n57TvB/l61sodIZScZKbESSuO/LJUjGFilX4Y9IipASL5HpKD+/qaC+eTSVnU/7y9h7E= Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=amd.com; Received: from tlendack-t1.amdoffice.net (165.204.77.1) by BN6PR12MB1139.namprd12.prod.outlook.com (10.168.226.141) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1199.15; Tue, 27 Jun 2017 15:11:56 +0000 From: Tom Lendacky Subject: [PATCH v8 RESEND 24/38] x86, swiotlb: Add memory encryption support To: linux-arch@vger.kernel.org, linux-efi@vger.kernel.org, kvm@vger.kernel.org, linux-doc@vger.kernel.org, x86@kernel.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, xen-devel@lists.xen.org, linux-mm@kvack.org, iommu@lists.linux-foundation.org Cc: Brijesh Singh , Toshimitsu Kani , Radim =?utf-8?b?S3LEjW3DocWZ?= , Matt Fleming , Alexander Potapenko , "H. Peter Anvin" , Larry Woodman , Jonathan Corbet , Joerg Roedel , "Michael S. Tsirkin" , Ingo Molnar , Andrey Ryabinin , Dave Young , Rik van Riel , Arnd Bergmann , Konrad Rzeszutek Wilk , Borislav Petkov , Andy Lutomirski , Boris Ostrovsky , Dmitry Vyukov , Juergen Gross , Thomas Gleixner , Paolo Bonzini Date: Tue, 27 Jun 2017 10:11:53 -0500 Message-ID: <20170627151152.17428.46131.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20170627150718.17428.81813.stgit@tlendack-t1.amdoffice.net> References: <20170627150718.17428.81813.stgit@tlendack-t1.amdoffice.net> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: CO2PR07CA0051.namprd07.prod.outlook.com (10.174.192.19) To BN6PR12MB1139.namprd12.prod.outlook.com (10.168.226.141) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b4e84797-61dd-4365-b18d-08d4bd6edcc5 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(48565401081)(300000503095)(300135400095)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095); SRVR:BN6PR12MB1139; X-Microsoft-Exchange-Diagnostics: 1; BN6PR12MB1139; 3:iGlfylgm1TChxi7i3CF+9nBNknbziYKyjASZtVELAjpI3KaE56fKr5UcBIrrnxU/VMhcmneK369TwKgCNClhgPshq35nLzefvZvGUooS62b9b048Ld3E0sRCgYMa/GwXfRX05bGWl4u6DAd/9qAMvGrefSM+VnDwKvzeL4tOYcWga/fgX+Tbn8Hd0iOg0wzeJo6dnfAn/ciwsBp1VJ1nyxE9ObSNhVZpnDCk+10z+e193EqRV1o+Ku0GKaV5VoYOBsSdjL7a/11mkSfv4P00BayunVZ/dVJ4sDa8EcPlPq5TbhaoffFCz8980TWZquMI3OkaTXcB1PTLzWyZVPIw7vl5OFtv+Ommz6P7JcLN6LuN3LxFB60L6osNgKExq+6TwmppRCJAcUuoAKWYP8/oLxh5xWVYbB6A5Jn71+dexx0aCgm0rznDxTZWROjX2j3OU1C9LPXzqwFD3HrhTaQfe+Hyshnb90CJ0lGbRmqtFQBOWeF8matXxpOaDHndqiroUEkPPr1/gjrz3tCZH4aw7SYkKb3Ayr64FXNGj7leq9sx0Xax6LaboHMJjyO0Bl9D7yvem3ycerPESiKHYwyuHcxgjZZ9bVu2DlRlk16USnBOykrLbyd2SCcJrNB1ZNgV+9qCl2R0Tm0n87vGaRrpjgk3oaxOpKE995dZmhs8Cks6dy3D9m3GFWxCWg6ytfyzFc5S6VfKlUT+EEcSD7uy4A== X-MS-TrafficTypeDiagnostic: BN6PR12MB1139: X-Microsoft-Exchange-Diagnostics: 1; BN6PR12MB1139; 25:va6YN02PAaIKtxmIzxk+Og0AY94chi2fCaY7/AvmIxhPKc2sLQ5XLqpeoEbbP696fcpIUKd/20wSe7lGNvbcYmv9JLYl/9nDmfj0jNYLX3so8y9TLN628dvBsE6OGtNcsC04lK8XN5IqcQRDLsEKsVUJ599ZI0q3hvklVRtVAyhb3MMF9iYvW/X7oHAjW+8skNEECd6CEoPKsZzXPs997eOlU8jcMu2ky4zrk72PEMPpoKMzUThRA/8s7m9ApmKZC2wMm6XMbNdQm2q7UXqjsDxaEhQRgonPIDDMwe19w4RWG+aL4zlQ5EHXuhQTb5Le0XJSv0dyi11nurPyVkpv2uqoHFLyKVLWI9E2IQFXNTxDEJxZRJiR1HNWTL+xKUZ21ger/6sTvfNbC0Z9GRR3sp1Kx1MTqzNY9pnDo2LtIGlliB0PSdYzx/Q2qWGMw2DhMmTvTzqVlRdU7AOgYnzOmabmnOuyUa8y4TuqM70enVmtpvNJzqVTa3BPb6VGaj/VrVVfGE9NlIAvvuDOHeBkQBPYDxQ1Sel2LO5wla2NCVnsVSn4fTO4n+xKr9p/+JQJwDA9u6Yr4PhfSQAEhHhuFPvNKZi7Qx3Yna2Ce4iKiqfnAPJmNUYEb7Mx2uAhRyLWi+BCBUWffWYDpg+Ow6Ich22jqwtkA2dBb0ljzRF4DwB33IfbLZtEqx3ZSyhkQHZfjBEirvjfz4AdKm7/f699KD8FKv296kO8C4gFxKtzRD+hmN56y5EZ/SdTBnozRtpx4t1iDaqFKawpn130Pw5vRv9cWlM9FIPNxjw/be93dS2qLVeInJmTPEAYphu0G6gGEwaIuPOJH2ZdBkc1h0MXSzGM3naAal5ZA0lmdydu5YWTah5BziLcWs6+VE3u0TJpGEbHwROgj8K6Whh4wmkNqzNRgtiBtPAMlhfFGbDl4 Lg= X-Microsoft-Exchange-Diagnostics: 1; BN6PR12MB1139; 31:4DtfjzxP1hRf0sP5uczsQyebdCEs7jGq6omyLrcGyOgyrY9l8iIRyjXWQlPyeGJvt2jEOHel9gsW1jssL/A3gQHbNYuqrH/uxZeHzJ0GqsSWfAZogAbEk4VGr+TYki0uN6sdfjEIUafmhoPv2ifZm3DobfP9mumpCxZS2ANXtne00W2yS70ISfgct4+O7geGqhQJEyEjrbajebXc0+S1ZNN9+6x+3SqdRmyIVOVVk7Vk4x5S4IwGmprxaJlYr0cl5dXFIRs2hIJwYkRrnu/vFfr2/R+eDYXMbdxEq3+XFfGUoiLIKIajyh5Tpuf2Wu430DFyvBfdUE61PEOlinUf304Ao/NWWc04hcQ94B8dpiSm6EsCWKWLBz36noU4gFP2BZjCgysOMBQkVoCSt6qKJw1QxSNGO5zpcoGpmKylETq4liLSCKnABnM7Ka/thIh8ptZQo4h0b2oKGMhVh5lwqC4yteT/SzlAxOGFs88KS6lQqC04+hRk1Q1n5BYxERSxnpriXQ/NYctstWG+LU+cM3COcwrfPAkfk3Gc+ZGBz/27zhOEbGe5n0WgN3NDRqJJWRe1svYwyZUdGx1+0V+x6WtGy4DMA9Zu+37kxJ4fhAxibwj723h/nb2Web9zrjq0aCKfX7xyh0JVbFhpByBWWT+zzqwaLKmpWVnpHz68DQc= X-Microsoft-Exchange-Diagnostics: 1; BN6PR12MB1139; 20:+OqtF2Uq3QUMh8h3QI0nwISBmRvc79voQvak3elhXF3GOlw4IC0WCZIOMskuIANbvfKmfSmz3ZiwgQTYqX4o9CNGsfwlq2Pep+v5jmjeiy4c6fseF0v965mVWIFXfndZJM8q4QPM7+FIyJqjVs+gwdlxXTbwbuQWHr1Loi23Xc5h4tMASdaQeiv5r53ATWH8a3jRJIWS88rLLz1WuFGfx/UK9NiPhcc0snSc9bLekHn159jpIAXjxzT1aqWC3XhW+OooumFZb4vIOU1clrbv6u4kgNT95r+q7suimYhlgUxscJbDv5kME87ghdBh7Ni6GmLzwSEqL/hCKBu5tGL7I/SYbOKeFFU/U1HDhUN+w3tJ0k6YeGKW9HNiX7nHTiKQ8kixb5yb3X+R8cLl16tg/El+LwBHxe/SkLzxEu3KIBVqeZSe1K+VlJysFCApvJ7rqoAByEaa56GApm/RQHLxFcZuPyZxX7LiKx6JIaDdmlGMY3rG0F3otc/EsLQ79C9V X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(133145235818549)(236129657087228)(767451399110)(167848164394848); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(3002001)(100000703101)(100105400095)(10201501046)(93006095)(93001095)(6055026)(6041248)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123564025)(20161123558100)(20161123560025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:BN6PR12MB1139; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:BN6PR12MB1139; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCTjZQUjEyTUIxMTM5OzQ6YkZoZXJwRjl1SVUrQ2ZrbUExRUJLU3R2Tis0?= =?utf-8?B?c1JEU2VsdWJFN2oySnFLd0RjbURZa1UzNS9ZZ3JDZWVqcEN3R2lPVm5xeUNC?= =?utf-8?B?ai9PSnNMOEtBY3lhSkc5ck5qRm1MLy96cll6Q3JuUCtFTlJvaXY1ZWFsSmxt?= =?utf-8?B?dkVwQVBvTms4dnY3dnU0elgreUdGRUpSUVR6MGdoTmlQemRPVDhkRnBjOEVY?= =?utf-8?B?Wk43UWlpTk1leG1xY2VoclpQUzN0V1ZvSDh6MUs1Y0FxcWc4bFVnRDdXTFhR?= =?utf-8?B?NTFjcXJMaFp3RXBjb21MK21BYkJ0TU5oUnZaM1pHZ25ZcGU2Sk54NkxTZ1lL?= =?utf-8?B?ZnM4SFk3b05tbE9zK2VHQmY5MHhhekIvWmNHNmFIM2VUVUpZMmNnaUx2N3p4?= =?utf-8?B?OUJTTWo0M3hBbmNHcXo5Q1pKTmNtYzJicHYzTFU5TVROV0cxMlRuK3N1dUhD?= =?utf-8?B?OUdGaVFBMW83clJ5anlBektqZTVYSmpoNm5oL1N5SVJPNlBwb3ZkejRtdXMy?= =?utf-8?B?M3JkYWhsVnRZS3lSNkVYRGZMcXpraHZoQktjR3pBQXhUY09BemkrRHA3cVlN?= =?utf-8?B?cDkxL2E3UXkrQ3R1RWlzWHpWa2Z4dEdyZWd4UWhxSUZCY1p2dzQ3SnhZNXN5?= =?utf-8?B?TzFESzk2K29aN09QZHdtVWpGakVyd2xJdVhVS0ZwQmFNcTlFS3FLMHYvRFJZ?= =?utf-8?B?K3g5UUpJRFZNLzhORWh3b09pYllKaWM2UFgxSnZrSG45TzkyVndLZHByTHRM?= =?utf-8?B?bjZWbUdrd3RJZWtOSmt2ajQ4cXkzNmRlZzlMNktrYWg1cWJ6eTRVU0krMTdV?= =?utf-8?B?Tis4cWZzaENyTGU0R01ISU9pbFVkdjBLRm5KUkNGU0JnUU1QMXRyemJON3RL?= =?utf-8?B?dDlpU0hiekdlQ1hIaWZmMVZBajZ6SDBQZHMwR0hLYlE3SkgwL0dlOUJsL3FG?= =?utf-8?B?WElwcFlJUjBERWtTRi95Yk9YYlRtUmdQcU9INExINFpxNWtIeW95ZFFPZHBZ?= =?utf-8?B?a1pKRFFqMVN0cWl5cnVMMFhTWDhBREU5Vmlid2ZUZTlJZlRQTXg0RTRVRzcz?= =?utf-8?B?Rk9mbzBydkxlWVNpU3RzZlBiVDh2UmJsanJMci9zNENSaVQ3eU5HdmRiNDNN?= =?utf-8?B?RUJTUnVMN0VHTDdRdjdWR01TQzgxWDFMNW5pb0F5VE4raTE5MHJYUlRmSk1X?= =?utf-8?B?VHJJeHZ6djY5emFKOU8zY3ZRN1M5RWJXTHhXUTZvWnNneVc2RDN6UE1nNkZB?= =?utf-8?B?KzBCK0xCZmxyWWhBNGFjbGpabXllVmR0Y1QydXMvZEE4RTArc1JOaWxwOTJk?= =?utf-8?B?OStGS1lRekl0WUFJdFgwMDZrTDA4Y1ZCVTd5dzBjU0V4Mm4vVDNhelppeFhX?= =?utf-8?B?eXkvK1RwK1hZKzA4K2ZicWw3ZTUvYWhNWDI1b2FDM0tDUTVVTXFwU2dNdW9W?= =?utf-8?B?U2RVU0svOEdPcDMxQkFJY255UHBGYWY1TnhlQ0tlSE9jVU5KeENaS0JuTzN1?= =?utf-8?B?azI3cnZ4cEE2RzJ1dkNrWkg3ZGJGb3ViRGxjVGp4MSs0TXFHM3ZzM2FmTWF4?= =?utf-8?B?cUQrd1l4bmljL3NRUDAyMzhwNko4VWxXcmlRN1V0SWZZNkZ2a1hyOXN4Q2Rs?= =?utf-8?B?QzIrYWhSM25Td1dKQzVxVWRPYVpHdDZOOE5mS0E5d1dRNGJMbTJ6OXBhRlJK?= =?utf-8?B?ZDFVd0lOSnBqMHNlT05YMnd0TmhDME5HUkFWaEJGVW5Ccm5BS21odkE4clNm?= =?utf-8?Q?fWB69GnYyEqcBaX/+GbzfQCVfAi4I1sK0KeQ=3D?= X-Forefront-PRVS: 0351D213B3 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(39450400003)(39850400002)(39400400002)(39840400002)(39410400002)(39860400002)(47776003)(230700001)(50466002)(110136004)(189998001)(50986999)(76176999)(54356999)(53416004)(72206003)(42186005)(478600001)(33646002)(305945005)(38730400002)(97746001)(83506001)(103116003)(23676002)(8676002)(66066001)(7736002)(4001350100001)(4326008)(81166006)(7416002)(7406005)(6506006)(1076002)(2950100002)(6666003)(9686003)(5660300001)(86362001)(53936002)(2906002)(6116002)(3846002)(25786009)(55016002)(54906002)(921003)(1121003); DIR:OUT; SFP:1101; SCL:1; SRVR:BN6PR12MB1139; H:tlendack-t1.amdoffice.net; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCTjZQUjEyTUIxMTM5OzIzOlhoYlpJalVOaHVTY0hscU5lM01PM2hwU05s?= =?utf-8?B?L21sMmhUOXhmZDhKbGVDdnY0Vk5rQ3NENEIxYzI2dmhUYTdqWWs5Qm9kMkNZ?= =?utf-8?B?V2Y3WHp5by81dnphYUl6V3A3bjBUb2FUMFlTSHNNZnlOcmdYMWJGMUNQTS9J?= =?utf-8?B?blljNC8xTldUeDFtR0dVYmFOc0lIN2hIWlhTNzNmSy8vb0NoL2toKzI4YmNv?= =?utf-8?B?TnN1cXdqeE1URTFYNUVPeUZNaExzUTY5Q3EzQ2VvVUtGMnNORXozZWl3MzBr?= =?utf-8?B?TUdWbVc3ZllscG9hOGlJTGFrL3M3Q3RCN1NRcTZzTFRTMVRYdmNnTC9ESE52?= =?utf-8?B?UDE3R05UVE5VOU5OdDhBSG9CVVEyRzhWOHpWQTN1amd0aTZRNytST1dEUk1r?= =?utf-8?B?QjRhY2Nsb1VseUNwMUdzbmtFV3dCNTBvOGVSa0FuUFhMcFN2ZEJaWUlURFVF?= =?utf-8?B?TVdHRk52R1YyWnBiNEpucHdqbWd0TERCbnFKbVQ1bTVsK1lDZDZWL1d6T1Jw?= =?utf-8?B?U0xITmhUUU91Tk1CQ3NNY3NhTXZnaVpHenI2UTIyN0JhNWVNMTZjcnVOMTRI?= =?utf-8?B?MVczckNNOWovbWF3UEI3dGFuajd2eDJWcnBhSEhqa3RwcGU0bkNGOVN2Vnl0?= =?utf-8?B?RHVMWGh6UDVxQTRyckwvbk1pNGVGZ2pnMVJmek5ibXpjVHNFY0NNcWo4eDdm?= =?utf-8?B?WFpqN09wTU0wdWN2anFFWVJzRzEzNlI5WUZSQ3Y5MGdVVlByLzA3aFdkcllI?= =?utf-8?B?dlVQWlFuM0l4MUFKTjFFaHRFSkV6NWFBK2F4dTJpd3NPaGU4cVdERHhnNXdj?= =?utf-8?B?NzJFMXdrclM4TXFaR09VZkZLVlVjMk53N2p4OHBCL2V0WHNhV1lnL0dUdGJO?= =?utf-8?B?d0QwN2d0L3gyM2prMGVVSGxnRUlIdXVReElQYWdvYzBKeXRMQ3FIeURFbXNI?= =?utf-8?B?ck5sYkNlSXNkeXlhbGt0cnB4ZjBqdFJ0RmNkQjJmdmhpSDFtL1NuZWV3YmxN?= =?utf-8?B?d0ZMS0ZSOWVUK0J4bCsrRDFhK1BHWDUwa1JheUFVQUxyeEd0eHdSQTBoeU4x?= =?utf-8?B?bHFMWm9hcWt2K1dnb1YwQkFCYUpTakNQc3dLVTYvMXZ2SW1DT1k2ckpnM0t3?= =?utf-8?B?aUM3R1pCMXZFSGlMMDBYZkdYODg1dUJPeWcvdnQ5OUhRYUdOa0h5cmx1S29o?= =?utf-8?B?MGh0R1ZqbDZHTVVPdHRwU3I2am4xbHl5RkpneGRIRmk1RnhWRTJ3RTVXZWsv?= =?utf-8?B?anNQOEpkV1dGZnphV1ZIdWFwM25oWCthYW1KUXFZTlI0dDd5dHU3bkpWaE9I?= =?utf-8?B?NWwvRzE5OTBGeE5CVWluYlRCVXphSTZSWUNhYS80RkpzdEZ3S1BVelk3WmVM?= =?utf-8?B?Rzd3aFdTQndEQ1dHN0didFRxSUkxQ21VdnpscnNKVm5obXFZZ20xMWFIK0R5?= =?utf-8?B?RHJYbS8xckFDaU53dG0yOXBWeHc5QWpsRnhwM1pWQm9YQ01kb2FmbTFOYjMy?= =?utf-8?B?TS9DTGFsT0tEYkx6amR5cHBJSFJVNmdkRmI3SzM1Z0EyS0dEY0h5YWt4eVZZ?= =?utf-8?B?OUFaV1YwaUNOVEpyRnZVN3NoTE5Fd1dSdmJBL1JoWFJRbmhqYWRSYVJ5aGFj?= =?utf-8?B?SUlQckNEV3lOcnMxR2NFdHlxR3dFbmNlRnFqZThEVjBhTDczeGJmQ3pUWHNR?= =?utf-8?Q?eY+kSk3fy/dmTYCHgM=3D?= X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCTjZQUjEyTUIxMTM5OzY6SUt2ME5FOXNzL0xrWmJJMTRMVkxRM1p0aEl3?= =?utf-8?B?bnI1ODJJN1hBcEhITmpObllOMHQ2aHhFL0g3bG0vTVpWdGJDaHlJQzJxamRH?= =?utf-8?B?YkEwYnU4K1J6allQQ3ZjWjJpbHpkM1VYWVhZaEVIS2FhZ2lQZkdKZktEaXVz?= =?utf-8?B?WnFuSlFndy9kUk5kK0xMd1NEbnBKRlRieW95VDc3Z3VNSUEvYVVyN0VRcVpS?= =?utf-8?B?WW4ydkQyaW5qSHRnOExabVh3c3NmU2pxR2YyMG4zQ25OeGxkL3pZUitkY1FC?= =?utf-8?B?S3k5NGkrNEY4ZWZacFZ3RmlHZE5vTVJoTFNCL3RxdDNXWGZqSGtQQ2doWjVi?= =?utf-8?B?eE1iTTB5d3Foc1BuRU5XWWo2ak56c0Jpd04vbGp5OEFSTCtqdGYwT1E5WEVs?= =?utf-8?B?bk1vWGtFVHBvNnNpOC9MYnlOR1FVUzZ4eEdPQ0dUSXdwVHhPTXphckp0elRK?= =?utf-8?B?SEVPOEtMVi8vdzhKcW54NWhMeHI4OFN6OHFSMGtNeDBDUkhlNnROZkNLNlhj?= =?utf-8?B?TEdDVjZRL2VDRmw1eWFvd0hqSTFRekl5TWNCZGxsa0FjZXZPZGF1SkE1bmZ4?= =?utf-8?B?ZGRiUTVTTUhZNjdLTzhrbHQ2aC9hc1M2MjZRQ2hIYU1SRWlrWnpZNlV4OWlW?= =?utf-8?B?Y0hCZk5MM2lyWWFrSzlwVEFxbEtIdllHUTJyWlZydm45Ynk0L0RpcFBvbVRV?= =?utf-8?B?cVV5MHVVWkpHQ2RkV3MvSVFoZnZpaS9uUlpkaUVSWnZKTVk0STBmNXpCV3Jm?= =?utf-8?B?b09OZjFQSFUxbys2dDU2VVQxeUNmMm82WlZVYjFYNkVyaU00WXZNbHNPK3oy?= =?utf-8?B?Vjd6cEF1a21LbkVBekpka2FBVlhYN2wraTdYNW5DOGI4S3NhZGl2MnZTK0U3?= =?utf-8?B?NGZCWHE3dVpYa3kzNjhOS3dGZ3Q0SXpERGg4cDZyWjdnYVA3VGhuaWd4M0x5?= =?utf-8?B?d1ZGb3ZWMXQ4Z25rcXVhREluRmVtT0dLclllNnUzRG05VjBMLytsTStVSTMr?= =?utf-8?B?UHQrR3BPK3hhbUE5eVRrOG9QNU16b1NWdDl2Y2wzQ0ZMdTZnekJnc0RzYnZ5?= =?utf-8?B?NTlNSWF5emlqeFlHOXdJbjR6bkVKaFBTQklIWWd3allWU0VtWU90L3NMR0FB?= =?utf-8?B?SlZQTWpLQXVGcmcvQW02c0tBREI3OVhxeWdCWk04cUtDbXhrQ3kydmIzK1ND?= =?utf-8?B?MENqdG9iVjB1YUFTeGpTWk1pVlIwazBZY3pneWpKd3F0YTd4eDZzbk9uOVFq?= =?utf-8?B?V1Q4ZEJMTTUxODRyaUU5SXJDYTF5M0VHSlJzNGFHc3VZWFh0R1F5WXI4MzIy?= =?utf-8?B?K3VWekRycng0WFRMUVR2QlhCMlhES2RNdWQ1MFAwL1NuQ2lEMFJTaUpFSE51?= =?utf-8?Q?CQyuLXz?= X-Microsoft-Exchange-Diagnostics: 1; BN6PR12MB1139; 5:UT/3nGkcH7FLmFtSN1Z3HOFgUfmaKOUu8x8i2Nwi/d7iJzY5ZT1edHItwGi7mtEv7a9NbAXIjwS8qQ3lwNyDNFVeNjd3xRU9qHi4uJww37xXc3Dp16gjdiS2b6gxjDYeOB1ls3grvav9OINeLq/H2X4axKoxP20yJs6X8fcOTIoVWKcsAb9x4++E/rPlbmIe6X59rED5nfChFZh2MHV0Zz9Vsr3yTBgr0aH2ZlcS/ueDhdZMQBKTdI7kMa5gViOET/SQUaFlrzFdqbXw2PesjpMbwE/aL13dXT14xPF3i1O1kNFDnPXisb9z/FRePmy9npnzT4SdU0fcAqJGNYx+uIvjL0WzwHpK9u++D56SW1rs759l+tkq4WR4Pu3a+QFBJYtBW2z2HwYQCOkqRDRne+jSMB9K3lBFAqaaQ4BXD9lKDCEzDZ9yjhWE/djULyA/Vha1Vs0DNcPb4zpt2G2mdnTzd8hSgAhtmPobP2HVhEUm1UkoGmEFL0S4yCaRM/KI; 24:tYUY+2Ntk+5DZltvBObg/H++2YpX9tYA2p9ad+16vdYqAYDM3+z+s54YWF4kRybUjJ9RngGtOYGRLJv8NZurB3KmVZJrt0MwEez58nbr7SA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN6PR12MB1139; 7:zEk0BErI6+WTFbOKOi2k0qDMBVKfuy2Vu6rfR4QsZ+01JzaIqn8eX/AfclvPkZHkkvGgvnlgaBcgagqNiYQHBVcNa7yUFU98Y+rFSuL1vvETTuIoMI9SCyuj72i7u4ExLEBUgnIZ0bUjrposEGPc3wuqRZCks/du6UnxxeAMCNYIuNqsXLaqjZCbaCfTtvXqYrk68L7BCAdzxP42f+9m7CmcEdg4x3uFmtxspLzR7B1TXMDg433ZIX2PHvYd1Wrvoo9jpyRPrRUVBYWpL2SI8QEpfRGocQ5VLOGDyZDh4mwGmJGu5XfFJdPt0i3IeYrZ9BUeRGJO+mutI07UMbUIFNJ58D7vg516fMKwMm0Pk3AoZmhcFtYhofre6ziHY3Zq1oC3sM6sbGpaeE4mh5lICeAN7FGfO1ZJKjn9uZve1K/nMOP0R+10fV1l5HIyPantFI8Jlm1Eddkn2cRpvXGLfLtYi3EKRQggJkaHulWRYLs3peVGBIQZ3iAN5/acm2PM19wFb43SRL4tdXrlXnun5xpNzgZNk+qWFSn2sd1BRIULmBUmLOMhsULfS+Hl9oskb+SXDpFco2PEMfU7gHKAM1gFW5SCiElXZKsT6sCePv9uCGGTqPwg75/yz1Q3R2ApVIFvg6IL+Gshvh3QtY/prHoRLc2r+ar6LIkyiBsdNTaOgrTv4JDhCH3fdSDI/vHjgpEQkOLrhQX9Wxyo/Uqq91kTzEWuGjRKNCKcS+ougTkntv1cn1wr7Caa6dnEPwoMF1ufAdrbmuq7ofksPl+3L6AIPd76PcO+RMcDervMgsQ= X-Microsoft-Exchange-Diagnostics: 1; BN6PR12MB1139; 20:bTaldPL/a+Pvo7rZPP6zLRj8y5+M7ZUI3aE+B8BDoFh2Pcnx+hyApUuI8hWv/yNSmG4SBtsMFjYqSTq83HxGbDgyH5WM6jbVuV+I+5mU/Y/vrpqjJlvY4+Nwo638/2rgHRvOAJtVqr1Sce2XL+fpWUHuO5PDUZ4O0nlDcnqz3WRWeDuPEisnf+Cm5Cc2qPitVKuxMYIPRGwfk6jQ34rXk1iasg1JA9tgij/wtiH0lwKqZTWLacIHNK9isO+JUZm8 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jun 2017 15:11:56.7984 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR12MB1139 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Since DMA addresses will effectively look like 48-bit addresses when the memory encryption mask is set, SWIOTLB is needed if the DMA mask of the device performing the DMA does not support 48-bits. SWIOTLB will be initialized to create decrypted bounce buffers for use by these devices. Signed-off-by: Tom Lendacky --- arch/x86/include/asm/dma-mapping.h | 5 ++- arch/x86/include/asm/mem_encrypt.h | 5 +++ arch/x86/kernel/pci-dma.c | 11 +++++-- arch/x86/kernel/pci-nommu.c | 2 + arch/x86/kernel/pci-swiotlb.c | 15 +++++++++- arch/x86/mm/mem_encrypt.c | 22 +++++++++++++++ include/linux/swiotlb.h | 1 + init/main.c | 10 +++++++ lib/swiotlb.c | 54 +++++++++++++++++++++++++++++++----- 9 files changed, 108 insertions(+), 17 deletions(-) diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index 08a0838..191f9a5 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h @@ -12,6 +12,7 @@ #include #include #include +#include #ifdef CONFIG_ISA # define ISA_DMA_BIT_MASK DMA_BIT_MASK(24) @@ -62,12 +63,12 @@ static inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size) static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr) { - return paddr; + return __sme_set(paddr); } static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr) { - return daddr; + return __sme_clr(daddr); } #endif /* CONFIG_X86_DMA_REMAP */ diff --git a/arch/x86/include/asm/mem_encrypt.h b/arch/x86/include/asm/mem_encrypt.h index ab1fe77..70e55f6 100644 --- a/arch/x86/include/asm/mem_encrypt.h +++ b/arch/x86/include/asm/mem_encrypt.h @@ -34,6 +34,11 @@ void __init sme_early_decrypt(resource_size_t paddr, void __init sme_encrypt_kernel(void); void __init sme_enable(void); +/* Architecture __weak replacement functions */ +void __init mem_encrypt_init(void); + +void swiotlb_set_mem_attributes(void *vaddr, unsigned long size); + #else /* !CONFIG_AMD_MEM_ENCRYPT */ #define sme_me_mask 0UL diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 3a216ec..72d96d4 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c @@ -93,9 +93,12 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size, if (gfpflags_allow_blocking(flag)) { page = dma_alloc_from_contiguous(dev, count, get_order(size), flag); - if (page && page_to_phys(page) + size > dma_mask) { - dma_release_from_contiguous(dev, page, count); - page = NULL; + if (page) { + addr = phys_to_dma(dev, page_to_phys(page)); + if (addr + size > dma_mask) { + dma_release_from_contiguous(dev, page, count); + page = NULL; + } } } /* fallback */ @@ -104,7 +107,7 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size, if (!page) return NULL; - addr = page_to_phys(page); + addr = phys_to_dma(dev, page_to_phys(page)); if (addr + size > dma_mask) { __free_pages(page, get_order(size)); diff --git a/arch/x86/kernel/pci-nommu.c b/arch/x86/kernel/pci-nommu.c index a88952e..98b576a 100644 --- a/arch/x86/kernel/pci-nommu.c +++ b/arch/x86/kernel/pci-nommu.c @@ -30,7 +30,7 @@ static dma_addr_t nommu_map_page(struct device *dev, struct page *page, enum dma_data_direction dir, unsigned long attrs) { - dma_addr_t bus = page_to_phys(page) + offset; + dma_addr_t bus = phys_to_dma(dev, page_to_phys(page)) + offset; WARN_ON(size == 0); if (!check_addr("map_single", dev, bus, size)) return DMA_ERROR_CODE; diff --git a/arch/x86/kernel/pci-swiotlb.c b/arch/x86/kernel/pci-swiotlb.c index 1e23577..6770775 100644 --- a/arch/x86/kernel/pci-swiotlb.c +++ b/arch/x86/kernel/pci-swiotlb.c @@ -6,12 +6,14 @@ #include #include #include +#include #include #include #include #include #include + int swiotlb __read_mostly; void *x86_swiotlb_alloc_coherent(struct device *hwdev, size_t size, @@ -79,8 +81,8 @@ int __init pci_swiotlb_detect_override(void) pci_swiotlb_late_init); /* - * if 4GB or more detected (and iommu=off not set) return 1 - * and set swiotlb to 1. + * If 4GB or more detected (and iommu=off not set) or if SME is active + * then set swiotlb to 1 and return 1. */ int __init pci_swiotlb_detect_4gb(void) { @@ -89,6 +91,15 @@ int __init pci_swiotlb_detect_4gb(void) if (!no_iommu && max_possible_pfn > MAX_DMA32_PFN) swiotlb = 1; #endif + + /* + * If SME is active then swiotlb will be set to 1 so that bounce + * buffers are allocated and used for devices that do not support + * the addressing range required for the encryption mask. + */ + if (sme_active()) + swiotlb = 1; + return swiotlb; } IOMMU_INIT(pci_swiotlb_detect_4gb, diff --git a/arch/x86/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c index 0843d02..a7400ec 100644 --- a/arch/x86/mm/mem_encrypt.c +++ b/arch/x86/mm/mem_encrypt.c @@ -13,11 +13,14 @@ #include #include #include +#include +#include #include #include #include #include +#include /* * Since SME related variables are set early in the boot process they must @@ -177,6 +180,25 @@ void __init sme_early_init(void) protection_map[i] = pgprot_encrypted(protection_map[i]); } +/* Architecture __weak replacement functions */ +void __init mem_encrypt_init(void) +{ + if (!sme_me_mask) + return; + + /* Call into SWIOTLB to update the SWIOTLB DMA buffers */ + swiotlb_update_mem_attributes(); +} + +void swiotlb_set_mem_attributes(void *vaddr, unsigned long size) +{ + WARN(PAGE_ALIGN(size) != size, + "size is not page-aligned (%#lx)\n", size); + + /* Make the SWIOTLB buffer area decrypted */ + set_memory_decrypted((unsigned long)vaddr, size >> PAGE_SHIFT); +} + void __init sme_encrypt_kernel(void) { } diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index 4ee479f..15e7160 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h @@ -35,6 +35,7 @@ enum swiotlb_force { extern unsigned long swiotlb_nr_tbl(void); unsigned long swiotlb_size_or_default(void); extern int swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs); +extern void __init swiotlb_update_mem_attributes(void); /* * Enumeration for sync targets diff --git a/init/main.c b/init/main.c index df58a41..5013cbc 100644 --- a/init/main.c +++ b/init/main.c @@ -488,6 +488,8 @@ void __init __weak thread_stack_cache_init(void) } #endif +void __init __weak mem_encrypt_init(void) { } + /* * Set up kernel memory allocators */ @@ -640,6 +642,14 @@ asmlinkage __visible void __init start_kernel(void) */ locking_selftest(); + /* + * This needs to be called before any devices perform DMA + * operations that might use the SWIOTLB bounce buffers. It will + * mark the bounce buffers as decrypted so that their usage will + * not cause "plain-text" data to be decrypted when accessed. + */ + mem_encrypt_init(); + #ifdef CONFIG_BLK_DEV_INITRD if (initrd_start && !initrd_below_start_ok && page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) { diff --git a/lib/swiotlb.c b/lib/swiotlb.c index a8d74a7..04ac91a 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -155,6 +156,15 @@ unsigned long swiotlb_size_or_default(void) return size ? size : (IO_TLB_DEFAULT_SIZE); } +void __weak swiotlb_set_mem_attributes(void *vaddr, unsigned long size) { } + +/* For swiotlb, clear memory encryption mask from dma addresses */ +static dma_addr_t swiotlb_phys_to_dma(struct device *hwdev, + phys_addr_t address) +{ + return __sme_clr(phys_to_dma(hwdev, address)); +} + /* Note that this doesn't work with highmem page */ static dma_addr_t swiotlb_virt_to_bus(struct device *hwdev, volatile void *address) @@ -183,6 +193,31 @@ void swiotlb_print_info(void) bytes >> 20, vstart, vend - 1); } +/* + * Early SWIOTLB allocation may be too early to allow an architecture to + * perform the desired operations. This function allows the architecture to + * call SWIOTLB when the operations are possible. It needs to be called + * before the SWIOTLB memory is used. + */ +void __init swiotlb_update_mem_attributes(void) +{ + void *vaddr; + unsigned long bytes; + + if (no_iotlb_memory || late_alloc) + return; + + vaddr = phys_to_virt(io_tlb_start); + bytes = PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT); + swiotlb_set_mem_attributes(vaddr, bytes); + memset(vaddr, 0, bytes); + + vaddr = phys_to_virt(io_tlb_overflow_buffer); + bytes = PAGE_ALIGN(io_tlb_overflow); + swiotlb_set_mem_attributes(vaddr, bytes); + memset(vaddr, 0, bytes); +} + int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose) { void *v_overflow_buffer; @@ -320,6 +355,7 @@ int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose) io_tlb_start = virt_to_phys(tlb); io_tlb_end = io_tlb_start + bytes; + swiotlb_set_mem_attributes(tlb, bytes); memset(tlb, 0, bytes); /* @@ -330,6 +366,8 @@ int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose) if (!v_overflow_buffer) goto cleanup2; + swiotlb_set_mem_attributes(v_overflow_buffer, io_tlb_overflow); + memset(v_overflow_buffer, 0, io_tlb_overflow); io_tlb_overflow_buffer = virt_to_phys(v_overflow_buffer); /* @@ -581,7 +619,7 @@ phys_addr_t swiotlb_tbl_map_single(struct device *hwdev, return SWIOTLB_MAP_ERROR; } - start_dma_addr = phys_to_dma(hwdev, io_tlb_start); + start_dma_addr = swiotlb_phys_to_dma(hwdev, io_tlb_start); return swiotlb_tbl_map_single(hwdev, start_dma_addr, phys, size, dir, attrs); } @@ -702,7 +740,7 @@ void swiotlb_tbl_sync_single(struct device *hwdev, phys_addr_t tlb_addr, goto err_warn; ret = phys_to_virt(paddr); - dev_addr = phys_to_dma(hwdev, paddr); + dev_addr = swiotlb_phys_to_dma(hwdev, paddr); /* Confirm address can be DMA'd by device */ if (dev_addr + size - 1 > dma_mask) { @@ -812,10 +850,10 @@ dma_addr_t swiotlb_map_page(struct device *dev, struct page *page, map = map_single(dev, phys, size, dir, attrs); if (map == SWIOTLB_MAP_ERROR) { swiotlb_full(dev, size, dir, 1); - return phys_to_dma(dev, io_tlb_overflow_buffer); + return swiotlb_phys_to_dma(dev, io_tlb_overflow_buffer); } - dev_addr = phys_to_dma(dev, map); + dev_addr = swiotlb_phys_to_dma(dev, map); /* Ensure that the address returned is DMA'ble */ if (dma_capable(dev, dev_addr, size)) @@ -824,7 +862,7 @@ dma_addr_t swiotlb_map_page(struct device *dev, struct page *page, attrs |= DMA_ATTR_SKIP_CPU_SYNC; swiotlb_tbl_unmap_single(dev, map, size, dir, attrs); - return phys_to_dma(dev, io_tlb_overflow_buffer); + return swiotlb_phys_to_dma(dev, io_tlb_overflow_buffer); } EXPORT_SYMBOL_GPL(swiotlb_map_page); @@ -958,7 +996,7 @@ void swiotlb_unmap_page(struct device *hwdev, dma_addr_t dev_addr, sg_dma_len(sgl) = 0; return 0; } - sg->dma_address = phys_to_dma(hwdev, map); + sg->dma_address = swiotlb_phys_to_dma(hwdev, map); } else sg->dma_address = dev_addr; sg_dma_len(sg) = sg->length; @@ -1026,7 +1064,7 @@ void swiotlb_unmap_page(struct device *hwdev, dma_addr_t dev_addr, int swiotlb_dma_mapping_error(struct device *hwdev, dma_addr_t dma_addr) { - return (dma_addr == phys_to_dma(hwdev, io_tlb_overflow_buffer)); + return (dma_addr == swiotlb_phys_to_dma(hwdev, io_tlb_overflow_buffer)); } EXPORT_SYMBOL(swiotlb_dma_mapping_error); @@ -1039,6 +1077,6 @@ void swiotlb_unmap_page(struct device *hwdev, dma_addr_t dev_addr, int swiotlb_dma_supported(struct device *hwdev, u64 mask) { - return phys_to_dma(hwdev, io_tlb_end - 1) <= mask; + return swiotlb_phys_to_dma(hwdev, io_tlb_end - 1) <= mask; } EXPORT_SYMBOL(swiotlb_dma_supported);