Commit cec6843e87fe29d8419fd5a9ed9912729c068656

Authored by bellard
1 parent e5097dc8

converted LSL/LAR/VERW/VERR to TCG - force 16 bit memory access for LSL/LAR

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4513 c046a42c-6fe2-441c-8c8c-71466251a162
target-i386/helper.c
@@ -3138,13 +3138,13 @@ void helper_rdmsr(void) @@ -3138,13 +3138,13 @@ void helper_rdmsr(void)
3138 } 3138 }
3139 #endif 3139 #endif
3140 3140
3141 -uint32_t helper_lsl(uint32_t selector) 3141 +target_ulong helper_lsl(target_ulong selector1)
3142 { 3142 {
3143 unsigned int limit; 3143 unsigned int limit;
3144 - uint32_t e1, e2, eflags; 3144 + uint32_t e1, e2, eflags, selector;
3145 int rpl, dpl, cpl, type; 3145 int rpl, dpl, cpl, type;
3146 3146
3147 - selector &= 0xffff; 3147 + selector = selector1 & 0xffff;
3148 eflags = cc_table[CC_OP].compute_all(); 3148 eflags = cc_table[CC_OP].compute_all();
3149 if (load_segment(&e1, &e2, selector) != 0) 3149 if (load_segment(&e1, &e2, selector) != 0)
3150 goto fail; 3150 goto fail;
@@ -3181,12 +3181,12 @@ uint32_t helper_lsl(uint32_t selector) @@ -3181,12 +3181,12 @@ uint32_t helper_lsl(uint32_t selector)
3181 return limit; 3181 return limit;
3182 } 3182 }
3183 3183
3184 -uint32_t helper_lar(uint32_t selector) 3184 +target_ulong helper_lar(target_ulong selector1)
3185 { 3185 {
3186 - uint32_t e1, e2, eflags; 3186 + uint32_t e1, e2, eflags, selector;
3187 int rpl, dpl, cpl, type; 3187 int rpl, dpl, cpl, type;
3188 3188
3189 - selector &= 0xffff; 3189 + selector = selector1 & 0xffff;
3190 eflags = cc_table[CC_OP].compute_all(); 3190 eflags = cc_table[CC_OP].compute_all();
3191 if ((selector & 0xfffc) == 0) 3191 if ((selector & 0xfffc) == 0)
3192 goto fail; 3192 goto fail;
@@ -3227,12 +3227,12 @@ uint32_t helper_lar(uint32_t selector) @@ -3227,12 +3227,12 @@ uint32_t helper_lar(uint32_t selector)
3227 return e2 & 0x00f0ff00; 3227 return e2 & 0x00f0ff00;
3228 } 3228 }
3229 3229
3230 -void helper_verr(uint32_t selector) 3230 +void helper_verr(target_ulong selector1)
3231 { 3231 {
3232 - uint32_t e1, e2, eflags; 3232 + uint32_t e1, e2, eflags, selector;
3233 int rpl, dpl, cpl; 3233 int rpl, dpl, cpl;
3234 3234
3235 - selector &= 0xffff; 3235 + selector = selector1 & 0xffff;
3236 eflags = cc_table[CC_OP].compute_all(); 3236 eflags = cc_table[CC_OP].compute_all();
3237 if ((selector & 0xfffc) == 0) 3237 if ((selector & 0xfffc) == 0)
3238 goto fail; 3238 goto fail;
@@ -3260,12 +3260,12 @@ void helper_verr(uint32_t selector) @@ -3260,12 +3260,12 @@ void helper_verr(uint32_t selector)
3260 CC_SRC = eflags | CC_Z; 3260 CC_SRC = eflags | CC_Z;
3261 } 3261 }
3262 3262
3263 -void helper_verw(uint32_t selector) 3263 +void helper_verw(target_ulong selector1)
3264 { 3264 {
3265 - uint32_t e1, e2, eflags; 3265 + uint32_t e1, e2, eflags, selector;
3266 int rpl, dpl, cpl; 3266 int rpl, dpl, cpl;
3267 3267
3268 - selector &= 0xffff; 3268 + selector = selector1 & 0xffff;
3269 eflags = cc_table[CC_OP].compute_all(); 3269 eflags = cc_table[CC_OP].compute_all();
3270 if ((selector & 0xfffc) == 0) 3270 if ((selector & 0xfffc) == 0)
3271 goto fail; 3271 goto fail;
target-i386/helper.h
@@ -23,10 +23,10 @@ void helper_aas(void); @@ -23,10 +23,10 @@ void helper_aas(void);
23 void helper_daa(void); 23 void helper_daa(void);
24 void helper_das(void); 24 void helper_das(void);
25 25
26 -uint32_t helper_lsl(uint32_t selector);  
27 -uint32_t helper_lar(uint32_t selector);  
28 -void helper_verr(uint32_t selector);  
29 -void helper_verw(uint32_t selector); 26 +target_ulong helper_lsl(target_ulong selector1);
  27 +target_ulong helper_lar(target_ulong selector1);
  28 +void helper_verr(target_ulong selector1);
  29 +void helper_verw(target_ulong selector1);
30 void helper_lldt(int selector); 30 void helper_lldt(int selector);
31 void helper_ltr(int selector); 31 void helper_ltr(int selector);
32 void helper_load_seg(int seg_reg, int selector); 32 void helper_load_seg(int seg_reg, int selector);
target-i386/op.c
@@ -167,34 +167,6 @@ void OPPROTO op_movl_T0_seg(void) @@ -167,34 +167,6 @@ void OPPROTO op_movl_T0_seg(void)
167 T0 = env->segs[PARAM1].selector; 167 T0 = env->segs[PARAM1].selector;
168 } 168 }
169 169
170 -void OPPROTO op_lsl(void)  
171 -{  
172 - uint32_t val;  
173 - val = helper_lsl(T0);  
174 - if (CC_SRC & CC_Z)  
175 - T1 = val;  
176 - FORCE_RET();  
177 -}  
178 -  
179 -void OPPROTO op_lar(void)  
180 -{  
181 - uint32_t val;  
182 - val = helper_lar(T0);  
183 - if (CC_SRC & CC_Z)  
184 - T1 = val;  
185 - FORCE_RET();  
186 -}  
187 -  
188 -void OPPROTO op_verr(void)  
189 -{  
190 - helper_verr(T0);  
191 -}  
192 -  
193 -void OPPROTO op_verw(void)  
194 -{  
195 - helper_verw(T0);  
196 -}  
197 -  
198 void OPPROTO op_arpl(void) 170 void OPPROTO op_arpl(void)
199 { 171 {
200 if ((T0 & 3) < (T1 & 3)) { 172 if ((T0 & 3) < (T1 & 3)) {
target-i386/translate.c
@@ -6333,9 +6333,9 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -6333,9 +6333,9 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
6333 if (s->cc_op != CC_OP_DYNAMIC) 6333 if (s->cc_op != CC_OP_DYNAMIC)
6334 gen_op_set_cc_op(s->cc_op); 6334 gen_op_set_cc_op(s->cc_op);
6335 if (op == 4) 6335 if (op == 4)
6336 - gen_op_verr(); 6336 + tcg_gen_helper_0_1(helper_verr, cpu_T[0]);
6337 else 6337 else
6338 - gen_op_verw(); 6338 + tcg_gen_helper_0_1(helper_verw, cpu_T[0]);
6339 s->cc_op = CC_OP_EFLAGS; 6339 s->cc_op = CC_OP_EFLAGS;
6340 break; 6340 break;
6341 default: 6341 default:
@@ -6606,21 +6606,27 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -6606,21 +6606,27 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
6606 break; 6606 break;
6607 case 0x102: /* lar */ 6607 case 0x102: /* lar */
6608 case 0x103: /* lsl */ 6608 case 0x103: /* lsl */
6609 - if (!s->pe || s->vm86)  
6610 - goto illegal_op;  
6611 - ot = dflag ? OT_LONG : OT_WORD;  
6612 - modrm = ldub_code(s->pc++);  
6613 - reg = ((modrm >> 3) & 7) | rex_r;  
6614 - gen_ldst_modrm(s, modrm, ot, OR_TMP0, 0);  
6615 - gen_op_mov_TN_reg(ot, 1, reg);  
6616 - if (s->cc_op != CC_OP_DYNAMIC)  
6617 - gen_op_set_cc_op(s->cc_op);  
6618 - if (b == 0x102)  
6619 - gen_op_lar();  
6620 - else  
6621 - gen_op_lsl();  
6622 - s->cc_op = CC_OP_EFLAGS;  
6623 - gen_op_mov_reg_T1(ot, reg); 6609 + {
  6610 + int label1;
  6611 + if (!s->pe || s->vm86)
  6612 + goto illegal_op;
  6613 + ot = dflag ? OT_LONG : OT_WORD;
  6614 + modrm = ldub_code(s->pc++);
  6615 + reg = ((modrm >> 3) & 7) | rex_r;
  6616 + gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0);
  6617 + if (s->cc_op != CC_OP_DYNAMIC)
  6618 + gen_op_set_cc_op(s->cc_op);
  6619 + if (b == 0x102)
  6620 + tcg_gen_helper_1_1(helper_lar, cpu_T[0], cpu_T[0]);
  6621 + else
  6622 + tcg_gen_helper_1_1(helper_lsl, cpu_T[0], cpu_T[0]);
  6623 + tcg_gen_andi_tl(cpu_tmp0, cpu_cc_src, CC_Z);
  6624 + label1 = gen_new_label();
  6625 + tcg_gen_brcond_tl(TCG_COND_EQ, cpu_tmp0, tcg_const_tl(0), label1);
  6626 + gen_op_mov_reg_T0(ot, reg);
  6627 + gen_set_label(label1);
  6628 + s->cc_op = CC_OP_EFLAGS;
  6629 + }
6624 break; 6630 break;
6625 case 0x118: 6631 case 0x118:
6626 modrm = ldub_code(s->pc++); 6632 modrm = ldub_code(s->pc++);