From patchwork Mon May 9 13:15:41 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 9046681 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 9D0F79F30C for ; Mon, 9 May 2016 13:18:54 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D25AF20115 for ; Mon, 9 May 2016 13:18:53 +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 A1567200F3 for ; Mon, 9 May 2016 13:18:48 +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 1azl2Q-0006NB-F5; Mon, 09 May 2016 13:15:54 +0000 Received: from mail6.bemta6.messagelabs.com ([85.158.143.247]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1azl2P-0006LP-9s for xen-devel@lists.xen.org; Mon, 09 May 2016 13:15:53 +0000 Received: from [85.158.143.35] by server-3.bemta-6.messagelabs.com id 52/E6-07120-88D80375; Mon, 09 May 2016 13:15:52 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupnkeJIrShJLcpLzFFi42JxWrohUrej1yD cYMcjXoslHxezODB6HN39mymAMYo1My8pvyKBNWPFSe2CB3wVx/6/ZGtgfMHdxcjJISHgL3Fy xn0mEJtNQF9i94tPYLaIgLrE6Y6LrF2MXBzMAtMZJR7/uMsOkhAWiJP4f+w5I4jNIqAi8fHZR TYQm1fAU2LGKpAGkKFyEueP/2QGsTkFvCTmdp1kAbGFgGpOHt3DDGGrSVzrv8QO0SsocXLmE7 AaZgEJiYMvXgDVcADN4Zb4220/gZFvFpKqWUiqFjAyrWJUL04tKkst0jXWSyrKTM8oyU3MzNE 1NDDTy00tLk5MT81JTCrWS87P3cQIDCgGINjB2PHP6RCjJAeTkiivK6NeuBBfUn5KZUZicUZ8 UWlOavEhRhkODiUJ3sIeg3AhwaLU9NSKtMwcYGjDpCU4eJREeItB0rzFBYm5xZnpEKlTjIpS4 ryBIAkBkERGaR5cGyyeLjHKSgnzMgIdIsRTkFqUm1mCKv+KUZyDUUmYVw1kCk9mXgnc9FdAi5 mAFsux6YMsLklESEk1MM6bGTL9yZrfawPrnyf8qJhsXFrAFXKdUys1VqPxisv3czG7b/B9+mw 1nUkwccp7a8Vy96PvlD/2/SyZnSIdvTnl+brk+1bWvFmP1CbIbYtkuPJchUV6f+N92yimkjpz wRV8ric9t+79fcN7/oTJTYm5Ds/37l9VGGpVEjxJqm8uc+3pTYcXpSqxFGckGmoxFxUnAgAxV faRogIAAA== X-Env-Sender: prvs=930ada366=Andrew.Cooper3@citrix.com X-Msg-Ref: server-3.tower-21.messagelabs.com!1462799749!12747770!3 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.34; banners=-,-,- X-VirusChecked: Checked Received: (qmail 45890 invoked from network); 9 May 2016 13:15:51 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP; 9 May 2016 13:15:51 -0000 X-IronPort-AV: E=Sophos;i="5.24,600,1454976000"; d="scan'208";a="352480336" From: Andrew Cooper To: Xen-devel Date: Mon, 9 May 2016 14:15:41 +0100 Message-ID: <1462799742-15507-4-git-send-email-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1462799742-15507-1-git-send-email-andrew.cooper3@citrix.com> References: <1462799742-15507-1-git-send-email-andrew.cooper3@citrix.com> MIME-Version: 1.0 X-DLP: MIA1 Cc: Andrew Cooper , Paul Durrant , Wei Liu , Jan Beulich Subject: [Xen-devel] [PATCH for-4.7 3/4] x86/hvm: Correct the emulated interaction of invlpg with segments 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 The `invlpg` instruction is documented to take a memory address, and is not documented to suffer faults from segmentation violations. Experimentally, and subsequently confirmed by both Intel and AMD, the instruction does take into account segment bases, but will happily invalidate a TLB entry for a mapping beyond the segment limit. The emulation logic will currently raise #GP/#SS faults for segment limit violations, or non-canonical addresses, which doesn't match hardware's behaviour. Instead, squash exceptions generated by hvmemul_virtual_to_linear() and proceed with invalidation. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich Reviewed-by: Paul Durrant --- CC: Jan Beulich CC: Paul Durrant CC: Wei Liu --- xen/arch/x86/hvm/emulate.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index ee5cf1f..e6316be 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -1608,7 +1608,22 @@ static int hvmemul_invlpg( rc = hvmemul_virtual_to_linear( seg, offset, 1, &reps, hvm_access_none, hvmemul_ctxt, &addr); - if ( rc == X86EMUL_OKAY ) + if ( rc == X86EMUL_EXCEPTION ) + { + /* + * `invlpg` takes segment bases into account, but is not subject to + * faults from segment type/limit checks, and is specified as a NOP + * when issued on non-canonical addresses. + * + * hvmemul_virtual_to_linear() raises exceptions for type/limit + * violations, so squash them. + */ + hvmemul_ctxt->exn_pending = 0; + hvmemul_ctxt->trap = (struct hvm_trap){}; + rc = X86EMUL_OKAY; + } + + if ( rc == X86EMUL_OKAY && is_canonical_address(addr) ) hvm_funcs.invlpg_intercept(addr); return rc;