From patchwork Fri Apr 22 08:59:23 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 8907191 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4D3709F1C1 for ; Fri, 22 Apr 2016 09:01:26 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 777ED20270 for ; Fri, 22 Apr 2016 09:01:25 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5F187201F5 for ; Fri, 22 Apr 2016 09:01:24 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1atWvw-0000UB-K8; Fri, 22 Apr 2016 08:59:28 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1atWvv-0000TX-Qn for xen-devel@lists.xen.org; Fri, 22 Apr 2016 08:59:27 +0000 Received: from [85.158.139.211] by server-6.bemta-5.messagelabs.com id 1B/C9-01795-FE7E9175; Fri, 22 Apr 2016 08:59:27 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrGLMWRWlGSWpSXmKPExsXitHRDpO6755L hBqtW6Fks+biYxYHR4+ju30wBjFGsmXlJ+RUJrBm3/r9mKzjPXzH3ygzWBsaVPF2MnBwSAv4S 099MYgex2QT0JXa/+MQEYosIqEuc7rjICmIzC+RJdH78CFYjLOAp0fH0H3MXIzsHi4CqxOl4k CivgIfEug/vmSAmykmcP/6TGcQWElCTuNZ/iR2iRlDi5MwnLBATJSQOvngBVMMBVM8t8bfbfg IjzywkVbOQVC1gZFrFqFGcWlSWWqRraKSXVJSZnlGSm5iZo2toYKqXm1pcnJiempOYVKyXnJ+ 7iREYHgxAsIOxb5bzIUZJDiYlUd7zDyTDhfiS8lMqMxKLM+KLSnNSiw8xynBwKEnwFj0DygkW paanVqRl5gADFSYtwcGjJMJbAJLmLS5IzC3OTIdInWJUlBLnPQqSEABJZJTmwbXBouMSo6yUM C8j0CFCPAWpRbmZJajyrxjFORiVhHkngUzhycwrgZv+CmgxE9DifxfAFpckIqSkGhiX164VTP yw7FzK3aKmfz2+d/OjF03t/7R6+uZTN3deUehk6l3Ot8D6skvav97imp/CUVZHburfTtNUupD 287jPLpHfgi4Mhfy1s+a9UzgZc2f9ydyoWzMbZ16dPE+Wze/Ahr/hze+qYiL3Nahckgp7vfjS 3u1rd7usFdq2/b+DzOnVZ1jsI6pjlFiKMxINtZiLihMB4KaD4YkCAAA= X-Env-Sender: prvs=9131db2f0=Andrew.Cooper3@citrix.com X-Msg-Ref: server-4.tower-206.messagelabs.com!1461315565!35977906!1 X-Originating-IP: [66.165.176.89] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 8.28; banners=-,-,- X-VirusChecked: Checked Received: (qmail 22780 invoked from network); 22 Apr 2016 08:59:26 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP; 22 Apr 2016 08:59:26 -0000 X-IronPort-AV: E=Sophos;i="5.24,516,1454976000"; d="scan'208";a="348965798" From: Andrew Cooper To: Xen-devel Date: Fri, 22 Apr 2016 09:59:23 +0100 Message-ID: <1461315563-2862-1-git-send-email-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.1.4 MIME-Version: 1.0 X-DLP: MIA1 Cc: Andrew Cooper , Wei Liu , Jan Beulich Subject: [Xen-devel] [PATCH for-4.7] x86/hvm: Correct emulation of invlpg instruction X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP `invlpg` and `invlpga` are specified to be NOPs when issued on non-canonical addresses. These instructions are not normally intercepted. They are however intercepted for HVM guests running in shadow paging mode. AMD hardware lacking decode hardware assistance uses the general instruction emulator to handle the interception. Alter hvmemul_invlpg() to swallow the #GP exception resulting from a non-canonical address, rather than reporting it back to the guest. Signed-off-by: Andrew Cooper --- CC: Jan Beulich CC: Wei Liu Note: Ideally this should be caught in the instruction emulator itself, but it is the hvmemul_virtual_to_linear() which completes the memory calculation including a possible non-zero %fs/%gs base. --- xen/arch/x86/hvm/emulate.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index cc0b841..897724e 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -1598,8 +1598,27 @@ static int hvmemul_invlpg( rc = hvmemul_virtual_to_linear( seg, offset, 1, &reps, hvm_access_none, hvmemul_ctxt, &addr); - if ( rc == X86EMUL_OKAY ) + switch ( rc ) + { + case X86EMUL_OKAY: hvm_funcs.invlpg_intercept(addr); + break; + + case X86EMUL_EXCEPTION: + ASSERT(hvmemul_ctxt->trap.vector == TRAP_gp_fault); + /* + * `invlpg` and `invlpga` are specified to be NOPs when issued on a + * non-canonical address. hvmemul_virtual_to_linear() latches a #GP + * which is the useful behaviour for most of its callers. + * + * Clear the pending exception to match avoid delivering a #GP fault + * to the guest. + */ + hvmemul_ctxt->exn_pending = 0; + hvmemul_ctxt->trap = (struct hvm_trap){}; + rc = X86EMUL_OKAY; + break; + } return rc; }