From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752805AbdLEBHS (ORCPT ); Mon, 4 Dec 2017 20:07:18 -0500 Received: from mail-by2nam01on0087.outbound.protection.outlook.com ([104.47.34.87]:63748 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752681AbdLEBGt (ORCPT ); Mon, 4 Dec 2017 20:06:49 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; From: Brijesh Singh To: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, x86@kernel.org Cc: bp@alien8.de, Brijesh Singh , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Joerg Roedel , Borislav Petkov , Tom Lendacky Subject: [Part2 PATCH v9 38/38] KVM: X86: Restart the guest when insn_len is zero and SEV is enabled Date: Mon, 4 Dec 2017 19:06:16 -0600 Message-Id: <20171205010616.5958-9-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20171205010616.5958-1-brijesh.singh@amd.com> References: <20171205010616.5958-1-brijesh.singh@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: BN6PR04CA0055.namprd04.prod.outlook.com (2603:10b6:405:3b::44) To DM2PR12MB0156.namprd12.prod.outlook.com (2a01:111:e400:50ce::19) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: df24aa0f-72c3-4948-2dc7-08d53b7c7433 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(5600026)(4604075)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(48565401081)(2017052603286);SRVR:DM2PR12MB0156; X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0156;3:MHqrGeP61E7phJwxq1A4KLEdhJpQo8iAL4uQ8Skv3k6bZcyy0B79/0+nfEizGJNWYfUxQdYsm9kv+4Hx7TBycHZpdlgZdLBmWyOu6RKIwympqeBusf5GJymPdDByKclgyR2gSgZRoEB3ZN24QyTCKcdHRlK7+DvPLUd4TCpmSvXcF61PBEginjMx2ytdtO+vDXHmWCj8DPSdjSrt9EHWUEtgTSkYyDXScri/jF09v62UFudmra/oalV/JYL+n+mM;25:RycZY8zOhauBCAQEUvc287KdBNqNsCHnRd+sQ/g7i+vmjDR719ze/HuqVbdfUlTJMpJE7xUdc/yNFnvVAXyKIUeex93XsLMFc3uLNZ48KQp9cDQ60LGAd5U6GErUKVtPpJinGxRKSzjRw3CKDJWDcZ6xT3yQjeLswJqWRCtUxuibaTzG+Ry7zhFQ9v4G+EPo73OVdyNMwyhjxnQaZSfEMnDDE1QoVh+hQFp/u3aixzv9BcSht2a9FjOZW37zV/MjHOV/f2TkLhF+sc6Ekfys2lPUxTu1DvroIohLciNlV2nuO5LlFadW7FjevIRfojbC+TIjHoDdFuRUbEwUhN/t/w==;31:17FHENs+WcLO16iDHNzGf2K7yEdgd2FYgyrVpj8NDdl+rGCjsGpB4MZ55376DLhAc6QbkMkM3N7hQG3tSXA0xMN6OJyAOjLTH2K2uEusRLxxti5Fdcszg7nn0T8WW8n+M7bdjMsWPIOD6lIIddpcLDlmyALPZwoUP51AQzGNlIDLebSs/bIKhidre9WWyByi5JGZIu035RMyTrsGwz5aSP6TRWUMwBfgt5k0SY0Dcro= X-MS-TrafficTypeDiagnostic: DM2PR12MB0156: X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0156;20:gA9fkTA+jZUII3939QGXu5+N6r8elxdX5GThe73+GKfYN+CNxpTNn/WShWJ15jvPw+OeQ/V64yj4fl+GpRBdU/ZnPzDmx01zwivbBtAb1Iq+IVe0I5vsRlazgQ93nsToWOjnhQBqCm/Mz/1osUp/H0UCd9gBvxbrYnEoLYkArdDNXOiNy4OvaAIQVsTmPpcb9rKzMFFQmD/pPc5ulf4mdDUbXQABHBqSri/J69cL6fDt+UloloCyvoWNc+WmOyNwLOKrtZXPY6gd4LeqCmdIqcqVK0rTO0eFTT4l55U+JBiDncyeW89ts9S0V+E180yY86Hd3+yc78qTBOAKJ+CmtvKS1QVHVE1tYB8lNEBq4/+yYrwMRhy8RqOBaITx4l8r8c632VqqO70aSRxp8DiPj6MruO5O1I1elrhRryK7PwkWnsI9qxKjnwAO3g9CNS5ZN9nU0Gj0hLqH7hj+VzknmQSB9/tS0n9OihfUVnvVSGK7YOvvwtlrqcZdM0CTv3kh;4:hR0/qi5HY8bQY9VflgVncm+qXW7UHzJhOH6uqGiBIav0gZVQtJSKrmmDAjyy0CSENFj5U8/J29a4GdrukTQK8pbhIItnJd2syOO2+uKZEAESQbnJLlVXh3m6AHm3yn8JchrUCFUqCg8/F2f0bbkXI4BnfFjsWB9kDXKR1zmGCOLZRnCF0YCgBei8HBdAxadOizus0Wkq76ATw7WHFPOXl0sqcuMViDrEtvWCe2lsQ/IPrQtD1YHAjlbf2LHf/lPq+fqV007cGz2X+iJt2AqQSkvbqS/joSgjkb3auuJeoobGZMaNpoN+HN7n4qcmgaayYBAO+KQOSNR7v02o9+TMvMT6Qp4B14p9o1cl6oFRVZXkbYyu2tZylTLvNjFfoz0p X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(9452136761055)(767451399110)(17755550239193); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040450)(2401047)(5005006)(8121501046)(10201501046)(93006095)(93001095)(3002001)(3231022)(6055026)(6041248)(20161123562025)(20161123560025)(20161123558100)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(6072148)(201708071742011);SRVR:DM2PR12MB0156;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:DM2PR12MB0156; X-Forefront-PRVS: 0512CC5201 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(376002)(346002)(39860400002)(366004)(189002)(199003)(316002)(66066001)(50466002)(23676004)(47776003)(25786009)(54906003)(86362001)(53416004)(7696005)(76176011)(16526018)(36756003)(575784001)(8936002)(81166006)(6486002)(81156014)(305945005)(50226002)(7736002)(53936002)(5660300001)(52116002)(2950100002)(6666003)(33646002)(4326008)(101416001)(8676002)(478600001)(2906002)(7416002)(2870700001)(1076002)(189998001)(106356001)(6116002)(3846002)(68736007)(97736004)(105586002);DIR:OUT;SFP:1101;SCL:1;SRVR:DM2PR12MB0156;H:wsp141597wss.amd.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtETTJQUjEyTUIwMTU2OzIzOmxqTUNGczMrMXV2NHlPaVFqK2FFZzJac1p4?= =?utf-8?B?WDhleGUrbk9oMlZOQm1lTmJrVlhTQnBTR1ZPbDMzcDlPMnhFdUxIRFptUGov?= =?utf-8?B?R1NpWTYxVjBCQUdUUlJ6VzJSa3djcWRVdW4zN1drbmVsVlczcXlOMGdOVGxG?= =?utf-8?B?L1g1d1pScXBuVXpYZUpneUN3MzVLd1NtZUtZUVc5bnFNZmc3eUlCQ3NIZUJR?= =?utf-8?B?NURKZEZCTURnOURhUTFrYjkrVkZqb3VmVUQzaTNSU0thK1J0QmI3aXVoNkdr?= =?utf-8?B?aG5hVnp2cXpWdDZ1TTRVS0VnMXdQejFVSXQyM2J3cURVYzJmUkhGU3lqbS9K?= =?utf-8?B?Q24yS2tQdzNxcDRTMlVnLzZRVm9XZHBYdG9kaEQ4aGdWcXZ3cHBnWGdPODE5?= =?utf-8?B?a21seU9lMVFaZnlIanF1TVE4eENkZEpiek1wQ1NsVy9mSWh1WGIwSGNyNTRQ?= =?utf-8?B?Tmwzcmh2aWpJMnErYk05clgxU3VmWVI2YTFXQmF0SXFmcFRSaVArSUFkQWhQ?= =?utf-8?B?TGZ6UmhmZjNGR0VmQjdRVTlHY3pnVTh6TVlQc3g0bDZEYjVTdnh3OVVrelds?= =?utf-8?B?UUMvMFVLMXZBczQxM1RxdDhrcmRwbEJNM0lLWmY2ank2Qjk5M2tOUjdReXMx?= =?utf-8?B?aTZWSDBOMmJhUnRlWjBLM1BxZlcrUCsyZG56cU9VSWYwSk1pUUxEUkJXeXVS?= =?utf-8?B?ZTRPaEhrV0hpWmNZR1pvQnhZU2FTSjlnTlF0alhWSmgya1lwV0RCRWdhNk56?= =?utf-8?B?ZmE1eEs4ek1raERCYVJqVmN5TjBQTHlidXZkd0lJVjVIQmVGSjdQVGhpTFhv?= =?utf-8?B?MDFvcnBySTBkRWZZU0EyaW1iUDlWY0NnbUpsKytVN3NvUEZjWHJsZXRuNWdV?= =?utf-8?B?WnNzc0w0bGFicFoyMHo1UnEvekhMdHBmZzJDcmpITE5QM2tLUEl6dHl4cHZj?= =?utf-8?B?R3BBVGpFT1l3UG90VE4ycFlMS1NIOElzajIyUWRlZ2FSN0wyVHBpSG9RZ3lX?= =?utf-8?B?MkRJZWl2NXZ4YXdiTDdRVWlaTXYrd0EvejhqUXhld1NCeWNqc3hjYzV3UXVH?= =?utf-8?B?VnRrVFp0bkUyZlhnbEh4SHIrNEh2N0k1V2xVUHpRNzZnVE9RN1dqR25oTTh6?= =?utf-8?B?c3FyekNXdnY2MGs0dnkzcEFZWTJJQ2lGZDhuNVRRaUVDYkVSRWtGZGd1dzUx?= =?utf-8?B?QnVGVE8vV01zY2wvdmNGSDM4dkFYY0hmWWxtdWZ0UyszWXpzMTY1M0FhbkMy?= =?utf-8?B?eVNhWTBMTVNJa3ZtdnpjK3dnQnczaG0xblBFZDB2YTZvdm5oVXErTS9FeVht?= =?utf-8?B?d1pjZTJteUhQV2FXNWNWZFB3ZFhIRkhBcXltU2gxZHVpeDVLTFB6V296b0Vw?= =?utf-8?B?OGVhRlBWMDlMWGFVb1RFSkZERk4wZVc2NmZIU0tyRFBFUkQ4VmwyY1R4UTUw?= =?utf-8?B?d204a2diVVN5SndSNm1HMkdaenh5M1NlWDZTb0Z0OHh2RkFrZWVRWkZtRzdT?= =?utf-8?Q?XLlKBaSgW3y4P6/tt46ex8cpfm6TTLQQUNPbuLNo06AEFf?= X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0156;6:sIkn7rIHNP11wujRnrjFAj7KIhCMwqPAhVYfHnjJrMos6TIXGTfDVzFkxU1D3oUqOU9daApgFtA1kxROb8RoKvX78B8VEdx1BYYBelq0cpEtLwYTtV9nNWFWL9gPNfd4TVQcigEhaVQlnKXxeaVTvTOha82a4CqoULGKtqFVIJUYhvW6wg2jol/sLDOFnlZ8qoXqSD8Tdl6nqtONrlVIY6pvn0wQdbc/lo9ASlT85C6DLNx/EBe0Y1hn9EhXasvCchVLCXWcuRN4lU5H3BlMtDfKiWYcuuNdVQ1sht3gJgYTdQ0TV1DrZeVNkpkVhEhcAKSjtE+kd+wdC8bWZzR1ORGCcFrqDx/MkIOnPhG6trU=;5:0n8oxNnlP9wGpmigYBZsEhmn41M2Zw4BY/OFoTBLO32dGhrsqMJEBgiK/mxASg2WI/rM2MqGcjsHzM8hxwlX50T+icREvLlaZcyHk8rS3wpGka4YGE9w1HXkR4Y3LG9FWjdEdezAbVPuoMf8E+/DYUqtl93ZjPEI0VCLvkNBbJA=;24:H9mIzWBVM506fC2JTNoauhWeOTA73fFnK7mcAuEu/3wzkaLktKCa93fsCg9I5snHYAvle6OEkD+b0+w3E4Hj3fNHDT+lPuMw2lMmhI3MuB4=;7:o8Iun7wDpeKUoif/n8OMtiyC1jlf4Tw4Q8UmanH52S0QhKtYs2gvc2164OL0fnZ7OgC8fwuefozGIhsEOOQhu80AbC5zegv75xUobpfCq2ng05ySqSIG+IflmwNtKhbCMC0XN8ir9VTBXimeVAHlaGqy+2KEG4iTr7BxqgNLk6g7K3S3TcYsHeSJ9DMqfpt66nwUMSZtuXrqjRrpSVGREQW2G+4yDX67mPmoUSVFLqx7bzveXpmUSB8o1ACgU1Qh SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0156;20:cAIxco0+bcEYIxSQrvwCBdgyjkIslA+WrctocwIicZPe520RRAG/lJYYalUcwPrwjHEftOlvlF8CcbP2k1fsTcMbtkCp6E7KJC4cXrjXy28N539rpcCbiVoeSED/Wi/x/KqkJt0qJikly5/w5mQ0nj8XWfJqBePv8KDzVxyAN0SxCl/gIrJB78PurLGEiSKhjZEywRc9sWLBXL63+vTddFDv5lvi2IKkxpmWZDYQYGON2oD+ZUDsm5I7Ck2oqVuu X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Dec 2017 01:06:44.2881 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: df24aa0f-72c3-4948-2dc7-08d53b7c7433 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR12MB0156 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On AMD platforms, under certain conditions insn_len may be zero on #NPF. This can happen if a guest gets a page-fault on data access but the HW table walker is not able to read the instruction page (e.g instruction page is not present in memory). Typically, when insn_len is zero, x86_emulate_instruction() walks the guest page table and fetches the instruction bytes from guest memory. When SEV is enabled, the guest memory is encrypted with guest-specific key hence hypervisor will not able to fetch the instruction bytes. In those cases we simply restart the guest. I have encountered this issue when running kernbench inside the guest. Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Paolo Bonzini Cc: "Radim Krčmář" Cc: Joerg Roedel Cc: Borislav Petkov Cc: Tom Lendacky Cc: x86@kernel.org Cc: kvm@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Brijesh Singh --- arch/x86/kvm/mmu.c | 10 ++++++++++ arch/x86/kvm/svm.c | 6 ++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index e5e66e5c6640..d5e5dbd0e5ad 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -4950,6 +4950,16 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code, if (mmio_info_in_cache(vcpu, cr2, direct)) emulation_type = 0; emulate: + /* + * On AMD platforms, under certain conditions insn_len may be zero on #NPF. + * This can happen if a guest gets a page-fault on data access but the HW + * table walker is not able to read the instruction page (e.g instruction + * page is not present in memory). In those cases we simply restart the + * guest. + */ + if (unlikely(insn && !insn_len)) + return 1; + er = x86_emulate_instruction(vcpu, cr2, emulation_type, insn, insn_len); switch (er) { diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 3e848f952b4f..ec5df5752995 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -2436,7 +2436,8 @@ static int pf_interception(struct vcpu_svm *svm) u64 error_code = svm->vmcb->control.exit_info_1; return kvm_handle_page_fault(&svm->vcpu, error_code, fault_address, - svm->vmcb->control.insn_bytes, + static_cpu_has(X86_FEATURE_DECODEASSISTS) ? + svm->vmcb->control.insn_bytes : NULL, svm->vmcb->control.insn_len); } @@ -2447,7 +2448,8 @@ static int npf_interception(struct vcpu_svm *svm) trace_kvm_page_fault(fault_address, error_code); return kvm_mmu_page_fault(&svm->vcpu, fault_address, error_code, - svm->vmcb->control.insn_bytes, + static_cpu_has(X86_FEATURE_DECODEASSISTS) ? + svm->vmcb->control.insn_bytes : NULL, svm->vmcb->control.insn_len); } -- 2.9.5