From patchwork Fri Dec 9 15:21:44 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 9468471 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id A3904607D8 for ; Fri, 9 Dec 2016 15:23:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 920172861E for ; Fri, 9 Dec 2016 15:23:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 822532861D; Fri, 9 Dec 2016 15:23:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 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.wl.linuxfoundation.org (Postfix) with ESMTPS id 06BD02861D for ; Fri, 9 Dec 2016 15:23:54 +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 1cFMze-0001Sk-Pg; Fri, 09 Dec 2016 15:21:50 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cFMzd-0001Sd-NA for xen-devel@lists.xenproject.org; Fri, 09 Dec 2016 15:21:49 +0000 Received: from [85.158.137.68] by server-3.bemta-3.messagelabs.com id 9C/DD-24885-C0CCA485; Fri, 09 Dec 2016 15:21:48 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrFIsWRWlGSWpSXmKPExsXS6fjDS5f7jFe EweyPuhbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8b96+vYC5ZZVDx4eoGpgfG9ZhcjB4eQQJ5E 66bSLkZODl4BO4nV+xczgdgSAoYST99fZwOxWQRUJd48fcwCYrMJqEu0PdvOCtIqImAgce5oE ojJLKAvsW0dC4gpLBAg8WyhJUixENDAO32bwQZyCthLdP/5B1bCKyAo8XeHMEiYGajk7tuTbB MYeWYhZGYhyUDYWhIPf91igbC1JZYtfM08C2yttMTyfxwQYVuJlxsvsqIqAbE9JB6uu8i4gJF jFaNGcWpRWWqRrqGFXlJRZnpGSW5iZo6uoYGxXm5qcXFiempOYlKxXnJ+7iZGYJjWMzAw7mD8 fdrzEKMkB5OSKG8xk1eEEF9SfkplRmJxRnxRaU5q8SFGGQ4OJQne9aeAcoJFqempFWmZOcCIg UlLcPAoifCePwGU5i0uSMwtzkyHSJ1iVJQS5y0H6RMASWSU5sG1waL0EqOslDAvIwMDgxBPQW pRbmYJqvwrRnEORiVh3lqQKTyZeSVw018BLWYCWjzvhjvI4pJEhJRUA6N00+MXKe43H28u1+t IuXNYTGbNcVM/jim8vR+kDr/YwjvZNWRhR8wEtVs3a14sWWq+7+XPLnm+ezdmPbXRaLmhwRv/ 6vjhLQ3/joRb5+Wp/ZrvfffM3F1FF/b3t+1Q7H3LpP7thpmqsmJeRra54On2VLGFjTustmzpZ fm04vVU0zuqb6PfpQkpsRRnJBpqMRcVJwIATZqHas0CAAA= X-Env-Sender: JBeulich@suse.com X-Msg-Ref: server-9.tower-31.messagelabs.com!1481296905!19874555!1 X-Originating-IP: [137.65.248.74] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.0.16; banners=-,-,- X-VirusChecked: Checked Received: (qmail 55208 invoked from network); 9 Dec 2016 15:21:47 -0000 Received: from prv-mh.provo.novell.com (HELO prv-mh.provo.novell.com) (137.65.248.74) by server-9.tower-31.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 9 Dec 2016 15:21:47 -0000 Received: from INET-PRV-MTA by prv-mh.provo.novell.com with Novell_GroupWise; Fri, 09 Dec 2016 08:21:45 -0700 Message-Id: <584ADA18020000780012768A@prv-mh.provo.novell.com> X-Mailer: Novell GroupWise Internet Agent 14.2.1 Date: Fri, 09 Dec 2016 08:21:44 -0700 From: "Jan Beulich" To: "xen-devel" References: <584AD75B020000780012765C@prv-mh.provo.novell.com> In-Reply-To: <584AD75B020000780012765C@prv-mh.provo.novell.com> Mime-Version: 1.0 Cc: Andrew Cooper Subject: [Xen-devel] [PATCH 1/2] x86emul: use SrcEax/DstEax where suitable for string insns 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-Virus-Scanned: ClamAV using ClamSMTP LODS, SCAS, and STOS all use the accumulator as one of their operands. This avoids come open coding of things, but requires switching around operands of SCAS. Signed-off-by: Jan Beulich x86emul: use SrcEax/DstEax where suitable for string insns LODS, SCAS, and STOS all use the accumulator as one of their operands. This avoids come open coding of things, but requires switching around operands of SCAS. Signed-off-by: Jan Beulich --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -135,9 +135,9 @@ static const opcode_desc_t opcode_table[ ByteOp|ImplicitOps, ImplicitOps, /* 0xA8 - 0xAF */ ByteOp|DstEax|SrcImm, DstEax|SrcImm, - ByteOp|ImplicitOps|Mov, ImplicitOps|Mov, - ByteOp|ImplicitOps|Mov, ImplicitOps|Mov, - ByteOp|ImplicitOps, ImplicitOps, + ByteOp|DstImplicit|SrcEax|Mov, DstImplicit|SrcEax|Mov, + ByteOp|DstEax|SrcImplicit|Mov, DstEax|SrcImplicit|Mov, + ByteOp|DstImplicit|SrcEax, DstImplicit|SrcEax, /* 0xB0 - 0xB7 */ ByteOp|DstReg|SrcImm|Mov, ByteOp|DstReg|SrcImm|Mov, ByteOp|DstReg|SrcImm|Mov, ByteOp|DstReg|SrcImm|Mov, @@ -3249,15 +3249,15 @@ x86_emulate( case 0xaa ... 0xab: /* stos */ { unsigned long nr_reps = get_rep_prefix(false, true); - dst.bytes = (d & ByteOp) ? 1 : op_bytes; + dst.bytes = src.bytes; dst.mem.seg = x86_seg_es; dst.mem.off = truncate_ea(_regs.edi); if ( (nr_reps == 1) || !ops->rep_stos || - ((rc = ops->rep_stos(&_regs.eax, + ((rc = ops->rep_stos(&src.val, dst.mem.seg, dst.mem.off, dst.bytes, &nr_reps, ctxt)) == X86EMUL_UNHANDLEABLE) ) { - dst.val = _regs.eax; + dst.val = src.val; dst.type = OP_MEM; nr_reps = 1; } @@ -3272,9 +3272,6 @@ x86_emulate( case 0xac ... 0xad: /* lods */ get_rep_prefix(true, false); - dst.type = OP_REG; - dst.bytes = (d & ByteOp) ? 1 : op_bytes; - dst.reg = (unsigned long *)&_regs.eax; if ( (rc = read_ulong(ea.mem.seg, truncate_ea(_regs.esi), &dst.val, dst.bytes, ctxt, ops)) != 0 ) goto done; @@ -3287,16 +3284,15 @@ x86_emulate( unsigned long next_eip = _regs.eip; get_rep_prefix(false, true); - src.bytes = dst.bytes = (d & ByteOp) ? 1 : op_bytes; - dst.val = _regs.eax; if ( (rc = read_ulong(x86_seg_es, truncate_ea(_regs.edi), - &src.val, src.bytes, ctxt, ops)) != 0 ) + &dst.val, src.bytes, ctxt, ops)) != 0 ) goto done; register_address_increment( _regs.edi, (_regs.eflags & EFLG_DF) ? -src.bytes : src.bytes); put_rep_prefix(1); - /* cmp: dst - src ==> src=*%%edi,dst=%%eax ==> %%eax - *%%edi */ - emulate_2op_SrcV("cmp", src, dst, _regs.eflags); + /* cmp: %%eax - *%%edi ==> src=%%eax,dst=*%%edi ==> src - dst */ + dst.bytes = src.bytes; + emulate_2op_SrcV("cmp", dst, src, _regs.eflags); if ( (repe_prefix() && !(_regs.eflags & EFLG_ZF)) || (repne_prefix() && (_regs.eflags & EFLG_ZF)) ) _regs.eip = next_eip; Reviewed-by: Andrew Cooper --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -135,9 +135,9 @@ static const opcode_desc_t opcode_table[ ByteOp|ImplicitOps, ImplicitOps, /* 0xA8 - 0xAF */ ByteOp|DstEax|SrcImm, DstEax|SrcImm, - ByteOp|ImplicitOps|Mov, ImplicitOps|Mov, - ByteOp|ImplicitOps|Mov, ImplicitOps|Mov, - ByteOp|ImplicitOps, ImplicitOps, + ByteOp|DstImplicit|SrcEax|Mov, DstImplicit|SrcEax|Mov, + ByteOp|DstEax|SrcImplicit|Mov, DstEax|SrcImplicit|Mov, + ByteOp|DstImplicit|SrcEax, DstImplicit|SrcEax, /* 0xB0 - 0xB7 */ ByteOp|DstReg|SrcImm|Mov, ByteOp|DstReg|SrcImm|Mov, ByteOp|DstReg|SrcImm|Mov, ByteOp|DstReg|SrcImm|Mov, @@ -3249,15 +3249,15 @@ x86_emulate( case 0xaa ... 0xab: /* stos */ { unsigned long nr_reps = get_rep_prefix(false, true); - dst.bytes = (d & ByteOp) ? 1 : op_bytes; + dst.bytes = src.bytes; dst.mem.seg = x86_seg_es; dst.mem.off = truncate_ea(_regs.edi); if ( (nr_reps == 1) || !ops->rep_stos || - ((rc = ops->rep_stos(&_regs.eax, + ((rc = ops->rep_stos(&src.val, dst.mem.seg, dst.mem.off, dst.bytes, &nr_reps, ctxt)) == X86EMUL_UNHANDLEABLE) ) { - dst.val = _regs.eax; + dst.val = src.val; dst.type = OP_MEM; nr_reps = 1; } @@ -3272,9 +3272,6 @@ x86_emulate( case 0xac ... 0xad: /* lods */ get_rep_prefix(true, false); - dst.type = OP_REG; - dst.bytes = (d & ByteOp) ? 1 : op_bytes; - dst.reg = (unsigned long *)&_regs.eax; if ( (rc = read_ulong(ea.mem.seg, truncate_ea(_regs.esi), &dst.val, dst.bytes, ctxt, ops)) != 0 ) goto done; @@ -3287,16 +3284,15 @@ x86_emulate( unsigned long next_eip = _regs.eip; get_rep_prefix(false, true); - src.bytes = dst.bytes = (d & ByteOp) ? 1 : op_bytes; - dst.val = _regs.eax; if ( (rc = read_ulong(x86_seg_es, truncate_ea(_regs.edi), - &src.val, src.bytes, ctxt, ops)) != 0 ) + &dst.val, src.bytes, ctxt, ops)) != 0 ) goto done; register_address_increment( _regs.edi, (_regs.eflags & EFLG_DF) ? -src.bytes : src.bytes); put_rep_prefix(1); - /* cmp: dst - src ==> src=*%%edi,dst=%%eax ==> %%eax - *%%edi */ - emulate_2op_SrcV("cmp", src, dst, _regs.eflags); + /* cmp: %%eax - *%%edi ==> src=%%eax,dst=*%%edi ==> src - dst */ + dst.bytes = src.bytes; + emulate_2op_SrcV("cmp", dst, src, _regs.eflags); if ( (repe_prefix() && !(_regs.eflags & EFLG_ZF)) || (repne_prefix() && (_regs.eflags & EFLG_ZF)) ) _regs.eip = next_eip;