From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Jyr87-0003SO-E6 for qemu-devel@nongnu.org; Wed, 21 May 2008 12:25:31 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Jyr86-0003Pr-07 for qemu-devel@nongnu.org; Wed, 21 May 2008 12:25:30 -0400 Received: from [199.232.76.173] (port=56570 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Jyr85-0003PY-Lz for qemu-devel@nongnu.org; Wed, 21 May 2008 12:25:29 -0400 Received: from savannah.gnu.org ([199.232.41.3]:46440 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Jyr85-0005L1-8P for qemu-devel@nongnu.org; Wed, 21 May 2008 12:25:29 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1Jyr84-0002gd-Bd for qemu-devel@nongnu.org; Wed, 21 May 2008 16:25:28 +0000 Received: from bellard by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1Jyr83-0002gR-S5 for qemu-devel@nongnu.org; Wed, 21 May 2008 16:25:28 +0000 MIME-Version: 1.0 Errors-To: bellard Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Fabrice Bellard Message-Id: Date: Wed, 21 May 2008 16:25:27 +0000 Subject: [Qemu-devel] [4513] converted LSL/LAR/VERW/ VERR to TCG - force 16 bit memory access for LSL/LAR Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 4513 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4513 Author: bellard Date: 2008-05-21 16:25:27 +0000 (Wed, 21 May 2008) Log Message: ----------- converted LSL/LAR/VERW/VERR to TCG - force 16 bit memory access for LSL/LAR Modified Paths: -------------- trunk/target-i386/helper.c trunk/target-i386/helper.h trunk/target-i386/op.c trunk/target-i386/translate.c Modified: trunk/target-i386/helper.c =================================================================== --- trunk/target-i386/helper.c 2008-05-21 16:24:20 UTC (rev 4512) +++ trunk/target-i386/helper.c 2008-05-21 16:25:27 UTC (rev 4513) @@ -3138,13 +3138,13 @@ } #endif -uint32_t helper_lsl(uint32_t selector) +target_ulong helper_lsl(target_ulong selector1) { unsigned int limit; - uint32_t e1, e2, eflags; + uint32_t e1, e2, eflags, selector; int rpl, dpl, cpl, type; - selector &= 0xffff; + selector = selector1 & 0xffff; eflags = cc_table[CC_OP].compute_all(); if (load_segment(&e1, &e2, selector) != 0) goto fail; @@ -3181,12 +3181,12 @@ return limit; } -uint32_t helper_lar(uint32_t selector) +target_ulong helper_lar(target_ulong selector1) { - uint32_t e1, e2, eflags; + uint32_t e1, e2, eflags, selector; int rpl, dpl, cpl, type; - selector &= 0xffff; + selector = selector1 & 0xffff; eflags = cc_table[CC_OP].compute_all(); if ((selector & 0xfffc) == 0) goto fail; @@ -3227,12 +3227,12 @@ return e2 & 0x00f0ff00; } -void helper_verr(uint32_t selector) +void helper_verr(target_ulong selector1) { - uint32_t e1, e2, eflags; + uint32_t e1, e2, eflags, selector; int rpl, dpl, cpl; - selector &= 0xffff; + selector = selector1 & 0xffff; eflags = cc_table[CC_OP].compute_all(); if ((selector & 0xfffc) == 0) goto fail; @@ -3260,12 +3260,12 @@ CC_SRC = eflags | CC_Z; } -void helper_verw(uint32_t selector) +void helper_verw(target_ulong selector1) { - uint32_t e1, e2, eflags; + uint32_t e1, e2, eflags, selector; int rpl, dpl, cpl; - selector &= 0xffff; + selector = selector1 & 0xffff; eflags = cc_table[CC_OP].compute_all(); if ((selector & 0xfffc) == 0) goto fail; Modified: trunk/target-i386/helper.h =================================================================== --- trunk/target-i386/helper.h 2008-05-21 16:24:20 UTC (rev 4512) +++ trunk/target-i386/helper.h 2008-05-21 16:25:27 UTC (rev 4513) @@ -23,10 +23,10 @@ void helper_daa(void); void helper_das(void); -uint32_t helper_lsl(uint32_t selector); -uint32_t helper_lar(uint32_t selector); -void helper_verr(uint32_t selector); -void helper_verw(uint32_t selector); +target_ulong helper_lsl(target_ulong selector1); +target_ulong helper_lar(target_ulong selector1); +void helper_verr(target_ulong selector1); +void helper_verw(target_ulong selector1); void helper_lldt(int selector); void helper_ltr(int selector); void helper_load_seg(int seg_reg, int selector); Modified: trunk/target-i386/op.c =================================================================== --- trunk/target-i386/op.c 2008-05-21 16:24:20 UTC (rev 4512) +++ trunk/target-i386/op.c 2008-05-21 16:25:27 UTC (rev 4513) @@ -167,34 +167,6 @@ T0 = env->segs[PARAM1].selector; } -void OPPROTO op_lsl(void) -{ - uint32_t val; - val = helper_lsl(T0); - if (CC_SRC & CC_Z) - T1 = val; - FORCE_RET(); -} - -void OPPROTO op_lar(void) -{ - uint32_t val; - val = helper_lar(T0); - if (CC_SRC & CC_Z) - T1 = val; - FORCE_RET(); -} - -void OPPROTO op_verr(void) -{ - helper_verr(T0); -} - -void OPPROTO op_verw(void) -{ - helper_verw(T0); -} - void OPPROTO op_arpl(void) { if ((T0 & 3) < (T1 & 3)) { Modified: trunk/target-i386/translate.c =================================================================== --- trunk/target-i386/translate.c 2008-05-21 16:24:20 UTC (rev 4512) +++ trunk/target-i386/translate.c 2008-05-21 16:25:27 UTC (rev 4513) @@ -6333,9 +6333,9 @@ if (s->cc_op != CC_OP_DYNAMIC) gen_op_set_cc_op(s->cc_op); if (op == 4) - gen_op_verr(); + tcg_gen_helper_0_1(helper_verr, cpu_T[0]); else - gen_op_verw(); + tcg_gen_helper_0_1(helper_verw, cpu_T[0]); s->cc_op = CC_OP_EFLAGS; break; default: @@ -6606,21 +6606,27 @@ break; case 0x102: /* lar */ case 0x103: /* lsl */ - if (!s->pe || s->vm86) - goto illegal_op; - ot = dflag ? OT_LONG : OT_WORD; - modrm = ldub_code(s->pc++); - reg = ((modrm >> 3) & 7) | rex_r; - gen_ldst_modrm(s, modrm, ot, OR_TMP0, 0); - gen_op_mov_TN_reg(ot, 1, reg); - if (s->cc_op != CC_OP_DYNAMIC) - gen_op_set_cc_op(s->cc_op); - if (b == 0x102) - gen_op_lar(); - else - gen_op_lsl(); - s->cc_op = CC_OP_EFLAGS; - gen_op_mov_reg_T1(ot, reg); + { + int label1; + if (!s->pe || s->vm86) + goto illegal_op; + ot = dflag ? OT_LONG : OT_WORD; + modrm = ldub_code(s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0); + if (s->cc_op != CC_OP_DYNAMIC) + gen_op_set_cc_op(s->cc_op); + if (b == 0x102) + tcg_gen_helper_1_1(helper_lar, cpu_T[0], cpu_T[0]); + else + tcg_gen_helper_1_1(helper_lsl, cpu_T[0], cpu_T[0]); + tcg_gen_andi_tl(cpu_tmp0, cpu_cc_src, CC_Z); + label1 = gen_new_label(); + tcg_gen_brcond_tl(TCG_COND_EQ, cpu_tmp0, tcg_const_tl(0), label1); + gen_op_mov_reg_T0(ot, reg); + gen_set_label(label1); + s->cc_op = CC_OP_EFLAGS; + } break; case 0x118: modrm = ldub_code(s->pc++);