From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754385AbdJPPgu (ORCPT ); Mon, 16 Oct 2017 11:36:50 -0400 Received: from mail-cys01nam02on0052.outbound.protection.outlook.com ([104.47.37.52]:10176 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754118AbdJPPfK (ORCPT ); Mon, 16 Oct 2017 11:35:10 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; From: Brijesh Singh To: x86@kernel.org Cc: bp@alien8.de, Tom Lendacky , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Borislav Petkov , Andy Shevchenko , David Laight , Arnd Bergmann , linux-kernel@vger.kernel.org, Brijesh Singh Subject: [Part1 PATCH v6 13/17] x86/io: Unroll string I/O when SEV is active Date: Mon, 16 Oct 2017 10:34:19 -0500 Message-Id: <20171016153423.2980-14-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20171016153423.2980-1-brijesh.singh@amd.com> References: <20171016153423.2980-1-brijesh.singh@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: BN6PR16CA0015.namprd16.prod.outlook.com (10.172.212.153) To SN1PR12MB0158.namprd12.prod.outlook.com (10.162.3.145) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 1ded4862-a039-4da4-a18c-08d514ab7628 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(2017030254152)(48565401081)(2017052603199)(201703131423075)(201703031133081)(201702281549075);SRVR:SN1PR12MB0158; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0158;3:g19kd+Upj+SoqdJhbVXBoguv+joGxu9GOObmp2ZzrSdJrUPLID+c929nrC/PfrQFuUQv9kVpQvVyMPA3BrGJOlHbSFD25wmDDpGIjTNvEq1NzRjIDE363WWtaunfp74737f2fIPKbbq7RHZYn/0KoXLLOQ9IpW2lycnu4TY0mZD1xVvqpcsFoV10BATU/lsSx2Wi7H+tpOaWg5+DuHD93E6nYBQKMFjIJoitvD9aBKsfIK1v3IFfl/PYeLTk82K5;25:k4IIXJslDCGiH0/Xv/dzEH+CUtN1D3hmfEFhBnZbS1yAFnXu3eQLKIqDlP1+9vSewVfgChgE+E8FKCOtLlyAHt8NhlGK8fsqaEAArABwQS+UbajWRkzzdjDuKsidXq5yE4FoMmWemFcMUaKqx7sBNf9rax2KRZEHl6NwAzYwAnnPz4vfgbM+ZwkrRK57feHM6zusILNFRElan6V6I9+A1Hu6fQp4QEDsuFY6bfMgr4oBUEsqADrvCxj0Di+71elF7xn335YjLuABAbs0yn2ty7BSxH3j/dApzDqlFkcjGjInL7Qr7JKNo5gNlRpAdLJviPOLG4bKHpR0BI+Lyb70Ug==;31:MctshMPAziwlXtOikgi8VHZYsXRX2H+RmBo7i/cdrVcfqADfe+UKR2FJUaPJJxU8duWPYHbKJCB8g97i7ipDFO8+2Urmn0a67ZiU6/EVL5mWipcTeKwNTogpuAuScFGTJuLIrbL+bTvjGnA6iZgv+V0tBpD8M10XHnrFR1F+n4s7jJuHWd9CGLd9+Z1W3UjuXmJji1+g+glegVXc14P2eh3WHAWlLRpWjY/YgjhEdi8= X-MS-TrafficTypeDiagnostic: SN1PR12MB0158: X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0158;20:cqxpL7UhVZItVmS06e8ZvW29jJn+7lIjPARleq6XgMmGWB+QXn/e4DGsIfU28L59azygQxb2hu/eJsau0gUMTbTjXOYWk7zazwhClbqpDl55x2C145oheDq9Y6kaGJWNClsMsTO+NtAxM9XEWGnGO3TNsUGzHcmkIxWvAFRb8H8ueTGSS1650bSbw8J2jCm4XgwdqOiylKWx0ANeo7tlIUCab0b0smBNys5XtdJTdpWqxv3ReBIWM1O4UFye2XAzmIuOFuxVMhi8/BUhPXTIDtrYbg/iOM2e41jitr7BRNC4IvhKXfY4FBdA4rFtnJRR7cZkqjs4vaNm6iSJwjnktrl4N87sCbpnVIf/135CCGvkplCgahBe2dNftP+6pEjiB+w5LJYdG34a7xROD/YghqURNEizTySAjQfFKktToUqv0mltWvmIpoGx+idIg5A1b2mPfWJ6B54QFs0YS30dvMLFO7qj+g3Q7lAF/oepqM//iIsFFYNZmaYB8kh2cMcZ;4:T4WtZdiSB+1uRYdz5gi/X1RfKDXNq20vo05wz2BvHsjaA3Tnrvkfu22AB+EPrAUC1ogy1/ne7C7HrmTB1pfmCQw//9TaFp01gbgKWou5qk9AdfPWgmWP7hZGH9pQCxApM2isIMANANNhE3/nSLCQgCCU+WG/wUuZP8cisYDvf2bvWTd8/IID4FUhtzBeyaS1ZjAIq/AZHH2VvIe/+EWb/Y4vKIEkFqcwCF4hPpuQSJaC/30k9R1BMs9v0o3WusqrxLZZgIhDCqE3juM0ZigQL1wbXy13LqJJHqCMOS0x7+53dGuPeFMWT/CHOLadKk/uSphQlEh7PsKZp907p5LXSfzRkMRFEKk/ut9roXscmh0= 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)(93006095)(93001095)(100000703101)(100105400095)(3002001)(10201501046)(6055026)(6041248)(20161123562025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123564025)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:SN1PR12MB0158;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:SN1PR12MB0158; X-Forefront-PRVS: 0462918D61 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(346002)(376002)(39860400002)(199003)(189002)(54906003)(7416002)(1076002)(316002)(5660300001)(16586007)(68736007)(2906002)(4326008)(16526018)(7736002)(47776003)(305945005)(6666003)(53936002)(86362001)(33646002)(2950100002)(6916009)(66066001)(189998001)(97736004)(76176999)(106356001)(101416001)(8676002)(53416004)(105586002)(36756003)(3846002)(6486002)(6116002)(8936002)(50226002)(81166006)(81156014)(25786009)(48376002)(478600001)(50986999)(2351001)(5003940100001)(2361001)(50466002);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR12MB0158;H:ubuntu-010236106000.amd.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN1PR12MB0158;23:1LGuaWT3i02ithbuNPmL6hfxFHVYpaSXKOymAorYR?= =?us-ascii?Q?exZ6qqAVJyhoG/UXySZGEGvhGBU7KAI2yXBstYtFlKzKoOMrcps1yk8dYDMy?= =?us-ascii?Q?TLw7USvygfTMB+y4wRJ6tinDWUxKgJbbkAkjauki/I5Vo7EHdaXjquOwWR9U?= =?us-ascii?Q?bM63zjPe2RazUHMsHjiLsOZdvoovtzYa2xcXWoTM1+YO2iatrSyrHDFXDD0T?= =?us-ascii?Q?523R+QY8SXty2hyJShJvs7tAmykEknD5NyxKlWZqLLgAVBORK+ArL9OU4A/u?= =?us-ascii?Q?PRkRzQVpGXwe61uPi8bQOgN7b2yO8N9QoK8Ha/krDf8xtu93tbpNQFEvvWm9?= =?us-ascii?Q?8Qva87Z0Q+qPZ68IGdmzIscWWV/fhDM0qIfcHj6u53c6mJsWDuQxqNHDznOV?= =?us-ascii?Q?C74jKP5JAKn5dJ3l8jyvVjSqgCjFxrYzztc9hZFg5V7QpNMOcptuBc7BZtEZ?= =?us-ascii?Q?2bERGTgzZB/0iP0/BPPfkvY+OVP3VR8aZVRymehdOdpRWxUg3R8PKf7+/29W?= =?us-ascii?Q?3VFvgZdma+Poilr/TZHrFnYMMJYhYV7bfhC0xkc2ancBU9pLLoishxDOswOB?= =?us-ascii?Q?XvLy4pS/eM5/Dgqt/0x5kfogXkD6Wbj8mOhU3hgtyjiYSl9gjsOICECjsN6J?= =?us-ascii?Q?WjiMKQsO3KXfFOwpI5V0NislI+JQPy0HIsM2fDWX6V7RMeGt5NGtB6o7UJc3?= =?us-ascii?Q?2gutF8KT8WYBX2uR1k0YPRR65t5r1UOEjHTtxWm4yiiGiGkYafkVPgxICNX0?= =?us-ascii?Q?4Q8lplSeKLQPCTQEPhNFg3m4OtAD4g4tvHrR5eHG5qPA7VvfCj7geP3xYDy5?= =?us-ascii?Q?2IecEIs8qncKxEgH9M/T21JvpSFa1V2L0f3nCVROxw6gJ+KGJHSTlO/BS+47?= =?us-ascii?Q?ZCeFE08JEYu38z8FXmYPuNHMpOUokY+VWn9DmO0kgkYordXvi7NE+WTHH16k?= =?us-ascii?Q?GlW/ghm3pI4VLWDkIvWnm/UsVQ5UMLANztEA4XiV5IHrGxbwQmXoN+jbtSoZ?= =?us-ascii?Q?09+xOBSsDS36LXPCoNUqnmoGrEYHB72HkpFjeEi+0NgmmdmILNe/rBoHnMP4?= =?us-ascii?Q?+ntjIqdTvQlhpoqyCTpwFxv5GL7D8EzpMHmRMOG+YVBu4IbUQKQY8RTsMXPA?= =?us-ascii?Q?rm5HrrOmBICmYb85tsUWm5QcDqsaJ5Ff1PhMH5Fmu14x1aGRVTdDA=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0158;6:YuTortOJb1GLCNfB35NEaBYjZdA0is4XbbWpywxP3OkiH+oD1ryTWrdR32uxZaZpwxHdYVXFuSsl1B+drZKDpGcldmTB2AqkcZi78RbuGEkfZHMRM7hiEgNcLuY27f//Hx2rvxPEEBRr44MhANDywxXJIJnW8Wf0A+7XwKs8d9jpZdgU5O7/x26YkL7paprFQBbaGSIF7FXl73Yjlg5LdQi/UE4TqXz6AFAR8WXuOwGFnIRbVJyU7+MT+nR2ZgUDWDG5vmUeC4V3Wi4OZZx4EEOY0d7X2bxnQbEdnxzz4NVUHK1bVzl1HUsBxNpLGoqNIxsoiHV0Y3QFjHo2gOTH9w==;5:lz8G3HwTnqi3nNsWveBlFVfbJkqxiV9pZeiCGiAxppVPmQL6CTu6YBO95+rSNg2S1zrZ2L34u8eThjlZdkUf9wxJmrVvI+WaSGS/in2289dyNglgAZUljGeM/2jiBSH1Y8VS4NbuUyaOGvl/+p8TZw==;24:uZ0nLpynsgoLPUNc2eKd7Pv2A6/D+8cV+Ks1zOC4TydsjGSWXkICNYzxdDAjleJULEmLrE/fzF6OiMgcWSh/9oIb0wAlJYBtb5XGyUu6pMI=;7:jY3i0Hcjjr5U+KcVSDldyGdYcgrO2G51QyhX3TTeFzaoezC3J4setCbuwziJx4wg6U7ikgKnqzudX4Jq3YOPYrW8UppglmLG12vgxcYCztzHXkImajqnUZoqFNHfpE4VK8L//NAtQRHlU7fZ7MT23DcKFKuVk9x3nWGADiB8VfCh/epdr5qMTZAycMS5bY1sz4UXLWyfFRudmvEYca1gw9hubhCYAbYSVaNl2bHKIV4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0158;20:8PGhw9I+aXj111zDgQk9mo6sMOT56j7jQAVgU/hIZghshOjFk1GV9KZ6jRjL/UO3Rgowl7JF5ZUSBdrBh5rZ6U7G56yR9abFDXvkDbhnuJY0g+z3WIo5bpguO6/xGKWo/xBmwTJS4TGhxkCXjEt9dWskf1xX7CxXlBSyKdFb9EU27WblDdzRJT+Ef1GBsUsMIm0JsW7n9yyRACE7v1N2x4IRAq/fEIfzHAPPpDgIqgiCbGqWU72o9U4VT8FyXP+R X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Oct 2017 15:34:58.6349 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0158 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 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 0c3186755dec..2336c3922227 100644 --- a/arch/x86/mm/mem_encrypt.c +++ b/arch/x86/mm/mem_encrypt.c @@ -41,6 +41,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 __section(.data) = false; @@ -313,6 +315,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