[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [4513] converted LSL/LAR/VERW/ VERR to TCG - force 16 bit m
From: |
Fabrice Bellard |
Subject: |
[Qemu-devel] [4513] converted LSL/LAR/VERW/ VERR to TCG - force 16 bit memory access for LSL/LAR |
Date: |
Wed, 21 May 2008 16:25:27 +0000 |
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++);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] [4513] converted LSL/LAR/VERW/ VERR to TCG - force 16 bit memory access for LSL/LAR,
Fabrice Bellard <=