From patchwork Wed Sep 27 15:13:25 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brijesh Singh X-Patchwork-Id: 9974229 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 0FC676037F for ; Wed, 27 Sep 2017 15:14:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F372128B80 for ; Wed, 27 Sep 2017 15:14:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E66932920B; Wed, 27 Sep 2017 15:14:43 +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=unavailable 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 4ABD028B80 for ; Wed, 27 Sep 2017 15:14:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753437AbdI0PO3 (ORCPT ); Wed, 27 Sep 2017 11:14:29 -0400 Received: from mail-by2nam03on0084.outbound.protection.outlook.com ([104.47.42.84]:59616 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753305AbdI0POR (ORCPT ); Wed, 27 Sep 2017 11:14:17 -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=1Ekgmr45F5+cnYQ56TtwdkzR5kzJZj5875FnhLcQYqk=; b=gYasfrOqRc+ba2GuNr3Ay5F+SHbvmnGvzLAypOa7pAiSQpdi5e4cKvga7tqPR+VW+n+yJleqqvxWt9ALm1kbjkO2tiLLbCg70F5qt/lRrYcpSZbgS3CuQ2OFyzttcvfL788zU1BTyjhslc62ODz3b/LwN72huTUn3/lBHpHmBSE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; Received: from ubuntu-010236106000.amd.com (165.204.78.1) by CY1PR12MB0152.namprd12.prod.outlook.com (10.161.173.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.7; Wed, 27 Sep 2017 15:14:06 +0000 From: Brijesh Singh To: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, x86@kernel.org Cc: Tom Lendacky , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Borislav Petkov , Andy Shevchenko , David Laight , Arnd Bergmann , Brijesh Singh Subject: [Part1 PATCH v5 13/17] x86/io: Unroll string I/O when SEV is active Date: Wed, 27 Sep 2017 10:13:25 -0500 Message-Id: <20170927151329.70011-14-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20170927151329.70011-1-brijesh.singh@amd.com> References: <20170927151329.70011-1-brijesh.singh@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: BN6PR04CA0033.namprd04.prod.outlook.com (10.174.93.150) To CY1PR12MB0152.namprd12.prod.outlook.com (10.161.173.22) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 91e631a9-9209-43b7-be3f-08d505ba6630 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254152)(48565401081)(2017052603199)(201703131423075)(201703031133081)(201702281549075); SRVR:CY1PR12MB0152; X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0152; 3:OEJ/UC+E8wwBNBk3+UfXVZlVhTdZuCJQL+bUmbN5eN2j0xVV5xrhjR1mXtwagVrWQwUf1ErdLnhfMDeFO7OZPO6Ssl3H/kVJRNqTB552/V+D6MyV6vatttWqMl+J6AZ/RMCHmshGiQ8rG+ypEXVLL7WtjkqODTqekb3bh/WazdAxp5Mh12S6ZgGsBckoABsrEIbdxE62IKk697UIOQXoi29RLMweUNVAOGfCvYN+qD5TxVwyl+Uuo8V40kZShlHU; 25:HmcT2XcZJ9Zf7zu1oe/Epu1t8G/js87NOXUAMS2is51rhc9my8BYD95weau02N7pcswOfppSmdKH59mXquRNIyEF515Sr/lYanwhLsCrZBgf2GBGi8JTqpDz1FnI84z1qZdALP+6KopztmJpB+plmRftTZ20VOkijozD8X8pQivyQZjxnmYGuaFxzXFjoAP/BOpsiPpQi1Vlv3+QvcpyYk+kkFHvs4tm+ksBiidw0qnhcS/NDswaXr+o+oOGRl5smSw7Tmiwzi26KVVSeXN0fyHe/zimKBIPG5vOKvi1Y8IjZZ+lDsDtjFVnpLvtqg21oGagwRRZ7i+CBX4kHqlbDA==; 31:mA03c06HzGRjCKzpl8xo1dBcYjCXnWDcCnW6Bb5tUZoXdMsdksj6Pbb7+Vmj1+9LpFvt7XcrphEQI+9kkkuAKn5VufgbLQ8GUpWcLXNY5ev195zZSNwF2wLhHgLr/DJ/FHrHGOQfOd2rG04/KHnGXN+vwqJmOl6hF1fgxadLvdxQmop7fSqSFau9MCvW6dlfkOHs6eqoUcrEGetvLExu3jIqwczJp3DZSeRtF5bMDFk= X-MS-TrafficTypeDiagnostic: CY1PR12MB0152: X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0152; 20:+qKEvLsTZVPJddNKi5Q4FmVBmC8pWIu34dzs/ZMXdbhDYePwmuMEIN3aU7WO/SYDj+SdgXOSWGcdOgGk6znYEiVQqdDwHzvBgEXxJog1J9ZcQYUc0BFk+o2LUHIp8N8QOpUymwWpJrq/bH61YSWAYsRkcT29WevQtkwkcncgPRBFLFj0pV4F0BAYu6kmHmsKCBIl4Xpb+5pb/Zl+6mk16kCeEMYmd/9y14ZDuOAxWFRO768l4Kv++GKA5GcJKUwtYVALpfNClqjGb4oNbykBbNRQWF/lkUBa02PYHfbC72c9eoHNsOW3vkSl4e6+J8TDHTPfX8uNOmg9BsHsSgePVIvzQW+QRtNVqm8yO2WPfWP457WDX3tWryvz015oue+sr5OBg12rUMtwIKplM/G1rcnU8CnP55dL6K0gGjqkHoS4cKHZh0it2WuCTF/yehcEPiYZxdlWYQJ/vzX2EPA6zv9kufqI94VVuqbWOEwg7YcF2Oww8/zY8QIO/m+9wo82; 4:oh2quKCgZRv4/i8/wM8Is7T7dpeD6RwGTy5ttKpox1h9IMr20T/jl7zNxV4bptglRwurH8w6A5RgfaiVorkXmOeMgf54OvNuTbWi56T3BKCgYD3uBP7A9HIjQJk7zD4ahlzaZmQ9ju2bEfBS5LY/cmG0NcwH2iWa0WPcEoT4wNtQO348/rP3s20PU2rqbbllRSxfjmMQuffm0S7/CE6cF3K76yK58NsSvTom8uAk9UkTlxjpgZMlQty6/PnNP0eDp4hFMmDt6YYUuxQ3GQ7Bj99E/w8hvNfu1QJoZhJWnlACaYfcJBR1lHlarIgougr4U9HWnxXumci/zy8q+8dcgUwrmy2YzRB1AWjVvj9Cxeg= X-Exchange-Antispam-Report-Test: UriScan:(9452136761055)(767451399110)(228905959029699); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(10201501046)(3002001)(93006095)(93001095)(100000703101)(100105400095)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123555025)(20161123562025)(20161123564025)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:CY1PR12MB0152; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:CY1PR12MB0152; X-Forefront-PRVS: 04433051BF X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(346002)(376002)(39860400002)(199003)(189002)(3846002)(25786009)(6116002)(53416004)(106356001)(8936002)(4326008)(54906003)(1076002)(6486002)(50226002)(8676002)(305945005)(50466002)(5003940100001)(81156014)(48376002)(81166006)(6666003)(68736007)(36756003)(189998001)(7736002)(105586002)(97736004)(53936002)(7416002)(2950100002)(101416001)(478600001)(16526017)(16586007)(76176999)(50986999)(316002)(47776003)(66066001)(86362001)(33646002)(5660300001)(2906002); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR12MB0152; H:ubuntu-010236106000.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR12MB0152; 23:Ss6D9iw17MbjTnrZDmm0nt4XRwM/N3JlTFnawiu76?= =?us-ascii?Q?vMZ1sw3ZEyZ72y7XEIHjlMLT97K8qls9b6SCcnyOu8b8c3tDjUpCoaQGCRuN?= =?us-ascii?Q?l0bK95t9hNbx1ehctLYpVbVo/sl4AsOSTtLNAIEjHk7cTS6CTpCi5tWTjvCk?= =?us-ascii?Q?xx7Ivu/AItAcQv7/cv/PYaJ+KoaVQ+3zK/E2hQwDRjGOPA7Qwgkvo6hPM47i?= =?us-ascii?Q?j9hs8g7f0gMK/WcEaMXXfdZsyWeiXf1LpT0ZUseAnVGxVky1P4cedbwpyNgl?= =?us-ascii?Q?3sy77EATr0XS/i99yjiWMuCfnoBsvOcX/E7Teqky1BrwLq1BBFb8kY3DcBVQ?= =?us-ascii?Q?cLxXTKWh6Z5uYtPWfXMEFMfbHlXS+2G9Ueh8zStwLvKls1mIHhYL+/f5G9jJ?= =?us-ascii?Q?IUKbnv8ytkNlnXbVuYvGznORlPdZZkDMG/OZRPe/t9iSxYoOa9ie/4X7z5Dc?= =?us-ascii?Q?kIhMWAvaWeNi3QKjOYR+FfQKWtp5fiqxm3e8gasyAOAUpx0EK6ySw72ksc1x?= =?us-ascii?Q?uObZPmVbqZbbgGUfVi5+pcrUEWvYEWaBahgMUD9klPnfle4WBLKViIdWW7d5?= =?us-ascii?Q?5uS82hybq3TYkJmC/v4yT57uNpayvGqoXmSF5mv9xCR05YnuS0qZ19/tHKUa?= =?us-ascii?Q?wF+TXE4EUPvtSeevhxJtdiOpcoFL0g2AKoCfbv1pxL3/ujdee2gy/7S7FKgk?= =?us-ascii?Q?8WGNfXgJJ3zusJI9CO0EugIPaH17lCe0yJpEe+99z2a1ttCnaZ+Z1LsymRrK?= =?us-ascii?Q?T3Ffp9z8oBys3FesPbmm6SEClhLi7pjftg3fdkMY/bmUS2Ay8Yem+2OmiMAF?= =?us-ascii?Q?KyRVHl/iYXBsGnjT9rWBVrHE53mKMVf6hywQLFzMWlAR7Xv+5g+39bnueABm?= =?us-ascii?Q?p43ZEol6oSA3Bu+vb4wKv25U40IFfBqmIuF5A5AtfVyz/d+8cnTRX5BFVRKI?= =?us-ascii?Q?J+K6JIFoJGB0YBFkzyOakf7dYRnP4kyl1bF9H1B0qTu9BPF/FIQg+Fk98vOL?= =?us-ascii?Q?ZNXkoOMDTZw/e5j+nWsBJT6cJkbMdO1YCDgaE+nKgQegwKAIohrq+QEU3oNF?= =?us-ascii?Q?nbX2tv2pZov0KCGpo28nJu4eYBoY1juT+W1mK4pQQrnQcLqKMIXKIdVtdHF+?= =?us-ascii?Q?1YLik30eaw=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0152; 6:fF7zcN5O0Zw6sQfiOfhmZi5kgjmZsZweYesGSph/o2uM+QPITmb4aIojY7DO0PShPgvJMxsXguFBzgaEiJyHffMsN9lBBT0m3iv0MXJLqJsqKyCIarhySqjgqqaKdGcIYcjV/CPvbJLfPA0CN3JMFm2UgGdMlj25vJKjPvUujzS63vtTO80kU5XA6YDrpGT6fDtsYguHRG9wDcX7FHkdFBUjMoZCnqA6V1ZwhgGT1ENUXgYW1qvhqh+3NyKQqHhYPTUrXf/fVUkP1JwNzNQDSaCD13TO2IF0AI6JaxmFy1OV30I18BfAdejtx9xUy+8sw4ktp1f2jhYSrpd/IkZe4A==; 5:/nV2qGuR8gjDoQV9ww2FR+JB+gOS1qjEm+tqgZj1xnOubY5WQ1TpUsQcjhzb6cbmXBR4xkZhlllD2bIG4h6pDFejiQ/DAb6AxsX88xDNMhiXrT6jX1PlvNjPSIOelXt5V9e1yQSFsHjBhLtDiBvKfw==; 24:E1/w7ohZKzfOx9OaV+vSwP8f4B7NX13NUNc08Qa9lkTqygEKH0yLroZP7Zyv83PzlCMnfN5V+Op1UAAiul1QZXSpaeZWvgQp/AFCXGEwwtI=; 7:2lIm6CscGulZK+qDoE/XFrEr0eciMy77TZM9IcwzwJZZnZV5NdS0K0Qe/rpfGCoiZscrr6V3A59kwmrotOFMNNR2x1Ytx3vHZ3w3c6iZZ2u/Ci0yLcDq3Z5gLDvm6sYwDjTLFXHiBJMRfbr9e8moSnDSdpp/YuVN0AcQjpVnP3rjy8olyP2uNNzO3iGfBYNLWRcMszBOCdpd5YIJ2Hq/9p3rwP71YSER4pN5hcegXOc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0152; 20:1GVYQPLLDuRGni1sqcxvCaHahU9FpUSffWtddupH86jVlcMdmX/E41AOT5rOuSHELHLMJ+7i2IIUkhj6ZxznmRfNRmkN0DIHOcIMvCxYs16h/h0VhOUq6a0bnwdjpcSQ007AI7+ghtpaa7x0QYre9Md1WLvqoNidXhzKA1IKlTWsoq3V3WQCQM252QHJfsQGONUtFUHYIOVEfYUQQzJbsw2Hg3w16OCn9EnSfV4bqHtZ/e3ZaYVaMzemlTahu2km X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Sep 2017 15:14:06.6194 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0152 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Tom Lendacky Secure Encrypted Virtualization (SEV) does not support string I/O, so unroll the string I/O operation into a loop operating on one element at a time. Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Borislav Petkov Cc: Andy Shevchenko Cc: David Laight Cc: Arnd Bergmann Cc: x86@kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Tom Lendacky Signed-off-by: Brijesh Singh Reviewed-by: Borislav Petkov --- arch/x86/include/asm/io.h | 42 ++++++++++++++++++++++++++++++++++++++---- arch/x86/mm/mem_encrypt.c | 8 ++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index c40a95c33bb8..a785270b53e1 100644 --- a/arch/x86/include/asm/io.h +++ b/arch/x86/include/asm/io.h @@ -265,6 +265,20 @@ static inline void slow_down_io(void) #endif +#ifdef CONFIG_AMD_MEM_ENCRYPT + +extern struct static_key_false __sev; +static inline bool sev_key_active(void) +{ + return static_branch_unlikely(&__sev); +} + +#else /* !CONFIG_AMD_MEM_ENCRYPT */ + +static inline bool sev_key_active(void) { return false; } + +#endif /* CONFIG_AMD_MEM_ENCRYPT */ + #define BUILDIO(bwl, bw, type) \ static inline void out##bwl(unsigned type value, int port) \ { \ @@ -295,14 +309,34 @@ static inline unsigned type in##bwl##_p(int port) \ \ static inline void outs##bwl(int port, const void *addr, unsigned long count) \ { \ - asm volatile("rep; outs" #bwl \ - : "+S"(addr), "+c"(count) : "d"(port) : "memory"); \ + if (sev_key_active()) { \ + unsigned type *value = (unsigned type *)addr; \ + while (count) { \ + out##bwl(*value, port); \ + value++; \ + count--; \ + } \ + } else { \ + asm volatile("rep; outs" #bwl \ + : "+S"(addr), "+c"(count) \ + : "d"(port) : "memory"); \ + } \ } \ \ static inline void ins##bwl(int port, void *addr, unsigned long count) \ { \ - asm volatile("rep; ins" #bwl \ - : "+D"(addr), "+c"(count) : "d"(port) : "memory"); \ + if (sev_key_active()) { \ + unsigned type *value = (unsigned type *)addr; \ + while (count) { \ + *value = in##bwl(port); \ + value++; \ + count--; \ + } \ + } else { \ + asm volatile("rep; ins" #bwl \ + : "+D"(addr), "+c"(count) \ + : "d"(port) : "memory"); \ + } \ } BUILDIO(b, b, char) diff --git a/arch/x86/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c index bc6ba4cbe9b4..05c3cb9fb442 100644 --- a/arch/x86/mm/mem_encrypt.c +++ b/arch/x86/mm/mem_encrypt.c @@ -39,6 +39,8 @@ static char sme_cmdline_off[] __initdata = "off"; */ u64 sme_me_mask __section(.data) = 0; EXPORT_SYMBOL_GPL(sme_me_mask); +DEFINE_STATIC_KEY_FALSE(__sev); +EXPORT_SYMBOL_GPL(__sev); static bool sev_enabled; @@ -311,6 +313,12 @@ void __init mem_encrypt_init(void) if (sev_active()) dma_ops = &sev_dma_ops; + /* + * With SEV, we need to unroll the rep string I/O instructions. + */ + if (sev_active()) + static_branch_enable(&__sev); + pr_info("AMD %s active\n", sev_active() ? "Secure Encrypted Virtualization (SEV)" : "Secure Memory Encryption (SME)");