From patchwork Wed Jun 21 12:03:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 9801687 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 73E9B600C5 for ; Wed, 21 Jun 2017 12:05:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 605AA28595 for ; Wed, 21 Jun 2017 12:05:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 52385285AF; Wed, 21 Jun 2017 12:05:51 +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 7686428595 for ; Wed, 21 Jun 2017 12:05:50 +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 1dNeMI-0007yR-SI; Wed, 21 Jun 2017 12:03:42 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dNeMI-0007xd-0I for xen-devel@lists.xenproject.org; Wed, 21 Jun 2017 12:03:42 +0000 Received: from [85.158.139.211] by server-11.bemta-5.messagelabs.com id 3D/3E-01733-C906A495; Wed, 21 Jun 2017 12:03:40 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrOIsWRWlGSWpSXmKPExsXS6fjDS3d2gle kQdtsZovvWyYzOTB6HP5whSWAMYo1My8pvyKBNePXg+qCudEVU/sSGxj32HYxcnIICeRJLJ3Z y9rFyMHBK2AncfhqKUhYQsBQ4vTCmywgNouAqsTG3f+ZQGw2AXWJtmfbwcpFBAwkzh1NAjGZB fQltq1jATGFBZwltu/lgZhdJHG0dS/YEE4Be4klXR/ZIPYISvzdIQwSZgZaefHobtYJjDyzED KzkGQgbC2Jh79usUDY2hLLFr5mngW2Vlpi+T8OiLCFxMWzU9kxlThLbLlRs4CRYxWjRnFqUVl qka6hgV5SUWZ6RkluYmYOkGeql5taXJyYnpqTmFSsl5yfu4kRGKAMQLCDcc1U50OMkhxMSqK8 5d5ekUJ8SfkplRmJxRnxRaU5qcWHGGU4OJQkeNPjgXKCRanpqRVpmTnAWIFJS3DwKInwugUAp XmLCxJzizPTIVKnGBWlxHnlQfoEQBIZpXlwbbD4vMQoKyXMywh0iBBPQWpRbmYJqvwrRnEORi VhXrs4oCk8mXklcNNfAS1mAlr84ogHyOKSRISUVANj89ZzJu+WBr9dGZ62Xphzlczz9NYO2X1 cjYVajXnrmgw3Lp3Os0qhMOr2Xcn2aRLfN6T/5sm4/2cdT31j+uT2c+89tqSKLXYoqWoOyEw7 Ur9HkPWW5c6Wlauvdns7ClrZ/l39+rspI09eqNFCX5sllfkMZscmby/sC1jEsjexVv5vz4605 2eUWIozEg21mIuKEwFaj9i5ygIAAA== X-Env-Sender: JBeulich@suse.com X-Msg-Ref: server-4.tower-206.messagelabs.com!1498046617!104376674!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.4.19; banners=-,-,- X-VirusChecked: Checked Received: (qmail 14626 invoked from network); 21 Jun 2017 12:03:38 -0000 Received: from prv-mh.provo.novell.com (HELO prv-mh.provo.novell.com) (137.65.248.74) by server-4.tower-206.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 21 Jun 2017 12:03:38 -0000 Received: from INET-PRV-MTA by prv-mh.provo.novell.com with Novell_GroupWise; Wed, 21 Jun 2017 06:03:36 -0600 Message-Id: <594A7CB7020000780016533F@prv-mh.provo.novell.com> X-Mailer: Novell GroupWise Internet Agent 14.2.2 Date: Wed, 21 Jun 2017 06:03:35 -0600 From: "Jan Beulich" To: "xen-devel" References: <594A733B020000780016527C@prv-mh.provo.novell.com> <594A733B020000780016527C@prv-mh.provo.novell.com> In-Reply-To: <594A733B020000780016527C@prv-mh.provo.novell.com> Mime-Version: 1.0 Cc: Andrew Cooper Subject: [Xen-devel] [PATCH 08/17] x86emul: fold/eliminate some local variables 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 Make i switch-wide (at once makeing it unsigned, as it should have been) and introduce n (for immediate use in enter and aam/aad handling). Eliminate on-stack arrays in pusha/popa handling. Use ea.val insatead of a custom variable in bound handling. No (intended) functional change. Signed-off-by: Jan Beulich x86emul: fold/eliminate some local variables Make i switch-wide (at once makeing it unsigned, as it should have been) and introduce n (for immediate use in enter and aam/aad handling). Eliminate on-stack arrays in pusha/popa handling. Use ea.val insatead of a custom variable in bound handling. No (intended) functional change. Signed-off-by: Jan Beulich --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -3229,6 +3229,7 @@ x86_emulate( struct segment_register cs, sreg; struct cpuid_leaf cpuid_leaf; uint64_t msr_val; + unsigned int i, n; unsigned long dummy; case 0x00 ... 0x05: add: /* add */ @@ -3361,47 +3362,45 @@ x86_emulate( goto done; break; - case 0x60: /* pusha */ { - int i; - unsigned int regs[] = { - _regs.eax, _regs.ecx, _regs.edx, _regs.ebx, - _regs.esp, _regs.ebp, _regs.esi, _regs.edi }; - + case 0x60: /* pusha */ fail_if(!ops->write); + ea.val = _regs.esp; for ( i = 0; i < 8; i++ ) + { + void *reg = decode_register(i, &_regs, 0); + if ( (rc = ops->write(x86_seg_ss, sp_pre_dec(op_bytes), - ®s[i], op_bytes, ctxt)) != 0 ) - goto done; + reg != &_regs.esp ? reg : &ea.val, + op_bytes, ctxt)) != 0 ) + goto done; + } break; - } - - case 0x61: /* popa */ { - int i; - unsigned int dummy_esp, *regs[] = { - &_regs.edi, &_regs.esi, &_regs.ebp, &dummy_esp, - &_regs.ebx, &_regs.edx, &_regs.ecx, &_regs.eax }; + case 0x61: /* popa */ for ( i = 0; i < 8; i++ ) { + void *reg = decode_register(7 - i, &_regs, 0); + if ( (rc = read_ulong(x86_seg_ss, sp_post_inc(op_bytes), &dst.val, op_bytes, ctxt, ops)) != 0 ) goto done; + if ( reg == &_regs.r(sp) ) + continue; if ( op_bytes == 2 ) - *(uint16_t *)regs[i] = (uint16_t)dst.val; + *(uint16_t *)reg = dst.val; else - *regs[i] = dst.val; /* 64b: zero-ext done by read_ulong() */ + *(unsigned long *)reg = dst.val; } break; - } case 0x62: /* bound */ { - unsigned long src_val2; int lb, ub, idx; + generate_exception_if(src.type != OP_MEM, EXC_UD); if ( (rc = read_ulong(src.mem.seg, src.mem.off + op_bytes, - &src_val2, op_bytes, ctxt, ops)) ) + &ea.val, op_bytes, ctxt, ops)) ) goto done; - ub = (op_bytes == 2) ? (int16_t)src_val2 : (int32_t)src_val2; + ub = (op_bytes == 2) ? (int16_t)ea.val : (int32_t)ea.val; lb = (op_bytes == 2) ? (int16_t)src.val : (int32_t)src.val; idx = (op_bytes == 2) ? (int16_t)dst.val : (int32_t)dst.val; generate_exception_if((idx < lb) || (idx > ub), EXC_BR); @@ -3957,10 +3956,7 @@ x86_emulate( dst.val = src.val; break; - case 0xc8: /* enter imm16,imm8 */ { - uint8_t depth = imm2 & 31; - int i; - + case 0xc8: /* enter imm16,imm8 */ dst.type = OP_REG; dst.bytes = (mode_64bit() && (op_bytes == 4)) ? 8 : op_bytes; dst.reg = (unsigned long *)&_regs.r(bp); @@ -3970,9 +3966,10 @@ x86_emulate( goto done; dst.val = _regs.r(sp); - if ( depth > 0 ) + n = imm2 & 31; + if ( n ) { - for ( i = 1; i < depth; i++ ) + for ( i = 1; i < n; i++ ) { unsigned long ebp, temp_data; ebp = truncate_word(_regs.r(bp) - i*dst.bytes, ctxt->sp_size/8); @@ -3989,7 +3986,6 @@ x86_emulate( sp_pre_dec(src.val); break; - } case 0xc9: /* leave */ /* First writeback, to %%esp. */ @@ -4084,28 +4080,21 @@ x86_emulate( goto grp2; case 0xd4: /* aam */ - case 0xd5: /* aad */ { - unsigned int base = (uint8_t)src.val; - + case 0xd5: /* aad */ + n = (uint8_t)src.val; if ( b & 0x01 ) - { - uint16_t ax = _regs.ax; - - _regs.ax = (uint8_t)(ax + ((ax >> 8) * base)); - } + _regs.ax = (uint8_t)(_regs.al + (_regs.ah * n)); else { - uint8_t al = _regs.al; - - generate_exception_if(!base, EXC_DE); - _regs.ax = ((al / base) << 8) | (al % base); + generate_exception_if(!n, EXC_DE); + _regs.al = _regs.al % n; + _regs.ah = _regs.al / n; } _regs.eflags &= ~(X86_EFLAGS_SF | X86_EFLAGS_ZF | X86_EFLAGS_PF); _regs.eflags |= !_regs.al ? X86_EFLAGS_ZF : 0; _regs.eflags |= ((int8_t)_regs.al < 0) ? X86_EFLAGS_SF : 0; _regs.eflags |= even_parity(_regs.al) ? X86_EFLAGS_PF : 0; break; - } case 0xd6: /* salc */ _regs.al = (_regs.eflags & X86_EFLAGS_CF) ? 0xff : 0x00; --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -3229,6 +3229,7 @@ x86_emulate( struct segment_register cs, sreg; struct cpuid_leaf cpuid_leaf; uint64_t msr_val; + unsigned int i, n; unsigned long dummy; case 0x00 ... 0x05: add: /* add */ @@ -3361,47 +3362,45 @@ x86_emulate( goto done; break; - case 0x60: /* pusha */ { - int i; - unsigned int regs[] = { - _regs.eax, _regs.ecx, _regs.edx, _regs.ebx, - _regs.esp, _regs.ebp, _regs.esi, _regs.edi }; - + case 0x60: /* pusha */ fail_if(!ops->write); + ea.val = _regs.esp; for ( i = 0; i < 8; i++ ) + { + void *reg = decode_register(i, &_regs, 0); + if ( (rc = ops->write(x86_seg_ss, sp_pre_dec(op_bytes), - ®s[i], op_bytes, ctxt)) != 0 ) - goto done; + reg != &_regs.esp ? reg : &ea.val, + op_bytes, ctxt)) != 0 ) + goto done; + } break; - } - - case 0x61: /* popa */ { - int i; - unsigned int dummy_esp, *regs[] = { - &_regs.edi, &_regs.esi, &_regs.ebp, &dummy_esp, - &_regs.ebx, &_regs.edx, &_regs.ecx, &_regs.eax }; + case 0x61: /* popa */ for ( i = 0; i < 8; i++ ) { + void *reg = decode_register(7 - i, &_regs, 0); + if ( (rc = read_ulong(x86_seg_ss, sp_post_inc(op_bytes), &dst.val, op_bytes, ctxt, ops)) != 0 ) goto done; + if ( reg == &_regs.r(sp) ) + continue; if ( op_bytes == 2 ) - *(uint16_t *)regs[i] = (uint16_t)dst.val; + *(uint16_t *)reg = dst.val; else - *regs[i] = dst.val; /* 64b: zero-ext done by read_ulong() */ + *(unsigned long *)reg = dst.val; } break; - } case 0x62: /* bound */ { - unsigned long src_val2; int lb, ub, idx; + generate_exception_if(src.type != OP_MEM, EXC_UD); if ( (rc = read_ulong(src.mem.seg, src.mem.off + op_bytes, - &src_val2, op_bytes, ctxt, ops)) ) + &ea.val, op_bytes, ctxt, ops)) ) goto done; - ub = (op_bytes == 2) ? (int16_t)src_val2 : (int32_t)src_val2; + ub = (op_bytes == 2) ? (int16_t)ea.val : (int32_t)ea.val; lb = (op_bytes == 2) ? (int16_t)src.val : (int32_t)src.val; idx = (op_bytes == 2) ? (int16_t)dst.val : (int32_t)dst.val; generate_exception_if((idx < lb) || (idx > ub), EXC_BR); @@ -3957,10 +3956,7 @@ x86_emulate( dst.val = src.val; break; - case 0xc8: /* enter imm16,imm8 */ { - uint8_t depth = imm2 & 31; - int i; - + case 0xc8: /* enter imm16,imm8 */ dst.type = OP_REG; dst.bytes = (mode_64bit() && (op_bytes == 4)) ? 8 : op_bytes; dst.reg = (unsigned long *)&_regs.r(bp); @@ -3970,9 +3966,10 @@ x86_emulate( goto done; dst.val = _regs.r(sp); - if ( depth > 0 ) + n = imm2 & 31; + if ( n ) { - for ( i = 1; i < depth; i++ ) + for ( i = 1; i < n; i++ ) { unsigned long ebp, temp_data; ebp = truncate_word(_regs.r(bp) - i*dst.bytes, ctxt->sp_size/8); @@ -3989,7 +3986,6 @@ x86_emulate( sp_pre_dec(src.val); break; - } case 0xc9: /* leave */ /* First writeback, to %%esp. */ @@ -4084,28 +4080,21 @@ x86_emulate( goto grp2; case 0xd4: /* aam */ - case 0xd5: /* aad */ { - unsigned int base = (uint8_t)src.val; - + case 0xd5: /* aad */ + n = (uint8_t)src.val; if ( b & 0x01 ) - { - uint16_t ax = _regs.ax; - - _regs.ax = (uint8_t)(ax + ((ax >> 8) * base)); - } + _regs.ax = (uint8_t)(_regs.al + (_regs.ah * n)); else { - uint8_t al = _regs.al; - - generate_exception_if(!base, EXC_DE); - _regs.ax = ((al / base) << 8) | (al % base); + generate_exception_if(!n, EXC_DE); + _regs.al = _regs.al % n; + _regs.ah = _regs.al / n; } _regs.eflags &= ~(X86_EFLAGS_SF | X86_EFLAGS_ZF | X86_EFLAGS_PF); _regs.eflags |= !_regs.al ? X86_EFLAGS_ZF : 0; _regs.eflags |= ((int8_t)_regs.al < 0) ? X86_EFLAGS_SF : 0; _regs.eflags |= even_parity(_regs.al) ? X86_EFLAGS_PF : 0; break; - } case 0xd6: /* salc */ _regs.al = (_regs.eflags & X86_EFLAGS_CF) ? 0xff : 0x00;