From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751837AbdIPMg5 (ORCPT ); Sat, 16 Sep 2017 08:36:57 -0400 Received: from mail-dm3nam03on0064.outbound.protection.outlook.com ([104.47.41.64]:54405 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751537AbdIPMfJ (ORCPT ); Sat, 16 Sep 2017 08:35:09 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; From: Brijesh Singh To: linux-kernel@vger.kernel.org, x86@kernel.org, kvm@vger.kernel.org Cc: Thomas Gleixner , Ingo Molnar , "H . Peter Anvin" , Borislav Petkov , Andy Lutomirski , Tom Lendacky , Andy Shevchenko , David Laight , Arnd Bergmann , Brijesh Singh Subject: [Part1 PATCH v4 13/17] x86/io: Unroll string I/O when SEV is active Date: Sat, 16 Sep 2017 07:34:14 -0500 Message-Id: <20170916123418.37807-14-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20170916123418.37807-1-brijesh.singh@amd.com> References: <20170916123418.37807-1-brijesh.singh@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: DM3PR12CA0051.namprd12.prod.outlook.com (10.161.151.19) To CY1PR12MB0152.namprd12.prod.outlook.com (10.161.173.22) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b270f86f-e9f4-4ed7-b5e6-08d4fcff5434 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(48565401081)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:CY1PR12MB0152; X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0152;3:JxJY+YJTZGyxivzmuI1IxACx95zNbCga1f13aiuDD9uOD1fUeoKfNlWBtHf3s2lkpuHxwD4KZnSqd3bcvBuSy3xNAtmdQEO8gl+877wedr5DJB/IECyVEIfnVdey1tmwfC56tAWCg8ax0UNWMnpGOfd63jiwxh/3eJM4CLCUn3OJV8NJhRu3HPAmgWtVNywSsWWeVSiX8iHShf6vsoV56Jxx36MUW9n2zIbCzsnaIH3OICUsI+dJb+2hJi7kXxZL;25:rIE4ct7PY7MROgnnI3PiXHLUHRrRt/J7VLIO0EbrMcpD2UbRysa6RIhZMzKdIIAiuUgiCmWuW2O3oXGAH/WXEyYkAjRJssOymgQIJDpwmdOO8H1m0W0zON9GTjgYKGlwPCIAJ91JJnbAr17ZgKm/Lz01SUqoPqGqYK5maYaeWffq2pyaPKvurOXupwWZhLQwIm7W/YC6Fp+Sck/aJS7drUDHy0yDsJlps+CC/T0nD60HvLhrAzKs8oyRIGJzsSEA55MkHMsLpxDDHAR+4RMBBndrS97wMay61APx7B8fBjiUIGVPr5eBGu1t3/3eV1qhFLVcKSro68ggKNdrvHKABA==;31:O0Y1j96KuLbsdBin/xnCPAfm42Jqfp/BESQ7uFEle7SN6vEbVaGr+GLToA9suPSMW+lBadCAywnuPDKSkWOAJrD4boBnZYmkDH3VTutV3NvqymUtmfCDgQLhuZ/1oMJo7PN85poQViSr0RU/z1lbBJXo5VTfyZlqQxwrp5la/qlA79JQr6e2vtGfhO6m9nb6P8VqFgQI0SFNJt+55+cY9SHQrV3qQKr9b7lbwLQeZGU= X-MS-TrafficTypeDiagnostic: CY1PR12MB0152: X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0152;20:NXYeJ5X338IwfxmwoktgasTxLoJP5FjAGkWKIM97wD1rseGPmc2BUY2upNNrRErq6HKYUCJy6rCdMoBSyfbykc3xyPGzMTlhoDGXkrF3IINc/AoNdqXAlVkB9ULZqdR7b/22pUQWZ1NO/HH/pvdHuzTIpn8LaFRNQ7vqkAv7rCRIU/sAmBpmcm070ZhyTGtIZVXrYgD/KzhkA/D/5SinRgvwJyDPXN6xYJsYA/yrejo3ZO322O1E/PFBlBjzwaUFyZMJD8mVUNfhLTV6pknTsJ06SqKXUS9QmnKuDgun/N84p845eKlT3Fm7uft/qd6Ko55LSmKknD9MI5GSP3wQz4LAIzYmDCSeak5euSa7j7z4W575mtz54EZoWvm3/COUlGh9Lxul6WLHgGNHkfDZqQZ6yb7YncrED9jr4zY3MqBcmFpSe76WSaFdnOMYYzL/L0J0hZhBHnIZtTa5c2iPiqbNP/rh/PpuF/UNUptt3+SaGNfRw5OyEUVygmF4CSHC;4:/qFn+PzuBWWt8FOjfRA4V86ZXtJ19vdsCTvs8GE0LNVli1lLj9NqSFyKRMLF9PdgTxK1p/conlpWz2mpm2bsgpGeSXMB+VVHgB94EbkHfqAzpXzAGt6O2hLgohEUIXxyGvsj+yy4PzuQ81rQS91wBL05LI79YXNC0Wwxy5qoaE1slK0+/hblM1QLCbwHa4CkjgOUJHhAvd7FKMnOcySN1HZtWXW4CWS8ZBLIaLJcaVMfxHjzFdVMGz4C8iiwcLCZp26PPmCnKQg9gKDUQ88nwM25FKijrreSbKTboeevCNfmWxU4CJL8YxyTmNTXblPs8ZAD7Hgn1NM9d3RmqhlSbW4t4wfD/SLMYlcT3kESMhM= 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)(100000703101)(100105400095)(93006095)(93001095)(3002001)(10201501046)(6055026)(6041248)(20161123564025)(20161123562025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123555025)(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: 0432A04947 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(346002)(376002)(199003)(189002)(6486002)(53416004)(81156014)(7416002)(48376002)(81166006)(50466002)(6666003)(5003940100001)(7736002)(54906002)(316002)(16586007)(8676002)(97736004)(2906002)(305945005)(575784001)(53936002)(5660300001)(86362001)(478600001)(16526017)(1076002)(106356001)(110136004)(3846002)(4326008)(50226002)(68736007)(25786009)(6116002)(33646002)(105586002)(101416001)(50986999)(47776003)(2950100002)(8936002)(66066001)(36756003)(189998001)(76176999);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR12MB0152;H:ubuntu-010236106000.amd.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR12MB0152;23:QDEHIv+hWbICHmMsIQRC8vuT4whTaaFdU5wjmLSHx?= =?us-ascii?Q?YtB/IYinnOC8J37y5hysgGtOhmoE3hRNjNnOScDbppwlr3bma9x/NPnBtmD/?= =?us-ascii?Q?D1PXVi+XnumxB90yFwr6gyzvXbVFQME2ehcO+4QsEfbKNXdhFlxUDG9PIrbZ?= =?us-ascii?Q?bIPj5gc6NopfakbMv0K0QQwsyWoZzRqdEsX2d5JflwcLY7LOyg/cs5kSm5Mn?= =?us-ascii?Q?ejsSZ5diMU7QMRxxIYAcN9yJ4M9CTAMV/3W9XvgDfce38fx0TQIi/qU3alOL?= =?us-ascii?Q?lTN3syFWPTTgss5nn5lTSBWKdSt1Jg2vgwKgquEV2/DtsCHl+MQjeNFE6xfS?= =?us-ascii?Q?6F9tz7clES0sKh6we62d8yWLiYhI8V2c1j1SSbsZEOo12zLjodpzfmj7dQzd?= =?us-ascii?Q?8d1kzLyfV4uS4VFEavFK+HP7hA8NOtC2lk58xErby+OHm4uh1z+cANOTFQgt?= =?us-ascii?Q?sbbZYdCwyQ2nV0Cvms8HyYgCQjxJD9QMt6inEtsQEZq4Jb63vXpHXFrVXRny?= =?us-ascii?Q?dqzDx0GhQ8o05HeIXnRrEKBYcJefmniHcC18e7q1QzV/qujTfKzGYvNz8JjZ?= =?us-ascii?Q?TKoTmwKDmgRMjOiPvKMqu0UhSsYKWDs39y94bOYdWrwxLSLSrzRFFsez61pS?= =?us-ascii?Q?YwQQEoIeJN+/Zu5AVNTRvitLcNnmkbfkPFLtO5jit/ERKBZM/MW+0KuYyoKX?= =?us-ascii?Q?VzxGz8PQnxVP/rdtbEn3JECanGyAihnN83acslJGYPy5ObRFWcVRo5LHUckb?= =?us-ascii?Q?XLQVJdJyXEoSoTovLLX/EqU45ALLHtygz/n+SvEZ0vKMOH1Orcte7bByVvqF?= =?us-ascii?Q?2xURE/WKG98jFwSB3TOMj21p2uObXyv08t3UuHz5KGEnudaqhS8zOR4bF7Vg?= =?us-ascii?Q?/BpLkOkPIJ0YmDRiNaEVW0xcQAEBtlDhRs7kA0T8q524mKSyKIcj1BZ393qv?= =?us-ascii?Q?akhgefE0WU5e5NFyamp8b3/pfsC2VWRi0KiCUBNtzB4/GWECIliNAbnUalD5?= =?us-ascii?Q?Oyi5S+WEmCWV6RP0QRDm44sbA3jVBr041r4OmWsmcDLKEluSviZLlyOWvurC?= =?us-ascii?Q?6T3Uxc3ZCwKIflEwgbPJkWOGY7pRyRKR5bAZaXGyVmnf1auvUcjfpxdsAKeR?= =?us-ascii?Q?VE6Y9lyyDfTC9icOeI1ABNgR0BijWNv?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0152;6:1WjX8BhjIWHnRLxVwTnXaRPFaXyRqwXff/j6INP7FJoEzgwRUY/mM6GqdgBbFLQXk8pQE0ajdxX57A/DOATg4FEF6MOPw23tkNtIyNIPUWW66Nl5z/2Pnf4wSu/ETmljCkbJioe7AUWC7blM9snNmP04TOyC/yE7d4wC7DnhUFZqiZ+h0Pr+SVbj6SKfCO5eC+zOjcQwKbLxjNQ6iUF0CGth53FHaM2lJTlQkiitaBqp1UID2bKo/Ptm8h5UHMh74vwe1rph1bsWWINoTZ0X21rWQ5OBxbdpGe+VsGAy9dp60W9TaVlW/OWJKs/il9shG1+/oXdwDR5FjKnUHI60JQ==;5:dOMZYqXFxjP8rAKVX7LPJngVEbwzy/kmDxjbfHqrVJmACShGJKsSIC80osY2ffO2ptbyLrjnsEypqSMGkaxaIUEn4qdkz8LxuPHh211QnKG3BTF/5PEpCQ9bdekBPRRqXsxT2GoMhf4wstxYKqqK+g==;24:iY1CyydMSyq/OlzZbvRE/MQ4iS7UEXb2FTIaaECzEKFdxrn+/kjS40KiF/QZVkTSpg3cwRLAEp6ei6JmLoidAcLXbw57alqXp36gYoUYBeE=;7:aZ4THUQQ9oQtrzaUZDOzWBibgLBiqxhOXwjkXxV3p4A+buDTqzmRDoLs5PAA4+Q2qNbP5D3dx9MaDuklUvxNMHEEPjk/OnyPV+R+5yBtiw5h3XXQlffK9Tp2tGAy/EzajRmrkdb6yuPrECH3ZlJT7SocJV4JSSg6cHfJjBTPR8iv9Fm1UcxRQIop0+s7kxhxh2L/wNlyAkFUhib8AEsqjr6VfmFsVNqmSoMJp4AHWJc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0152;20:AaEu+IVgqjOD/BebcMyStCpGlk9hu6RHnsDF0RBwkgv/8C61AsF/B8dscoL+6VXELHGlBV4x21L0GhCmnTYnQ9wnZxj6Sr7PsIMunOOxTMiM+dHx0zdwrFXZ8py8rk9jG4S2aPvUK/2+NEgOtfTbKUkc+54fE25Mmp1q8vmh6Oj3/QIrCWcbraiKPusELmpmkhGgPqR/4lmNsRp109fVrrhfgABvGc8GTC3c/JRVTl0xk5qHPcwD/RRbOspRJlDN X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Sep 2017 12:34:51.9745 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0152 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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..07c28ee398d9 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_active(void) +{ + return static_branch_unlikely(&__sev); +} + +#else /* !CONFIG_AMD_MEM_ENCRYPT */ + +static inline bool __sev_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_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_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 9b0c921c0597..b361fabde4c8 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); unsigned int sev_enabled __section(.data) = 0; @@ -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)"); -- 2.9.5