qemu-devel
[Top][All Lists]
Advanced

[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++);






reply via email to

[Prev in Thread] Current Thread [Next in Thread]