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
This commit is contained in:
bellard 2008-05-21 16:25:27 +00:00
parent e5097dc8e3
commit cec6843e87
4 changed files with 39 additions and 61 deletions

View File

@ -3138,13 +3138,13 @@ void helper_rdmsr(void)
} }
#endif #endif
uint32_t helper_lsl(uint32_t selector) target_ulong helper_lsl(target_ulong selector1)
{ {
unsigned int limit; unsigned int limit;
uint32_t e1, e2, eflags; uint32_t e1, e2, eflags, selector;
int rpl, dpl, cpl, type; int rpl, dpl, cpl, type;
selector &= 0xffff; selector = selector1 & 0xffff;
eflags = cc_table[CC_OP].compute_all(); eflags = cc_table[CC_OP].compute_all();
if (load_segment(&e1, &e2, selector) != 0) if (load_segment(&e1, &e2, selector) != 0)
goto fail; goto fail;
@ -3181,12 +3181,12 @@ uint32_t helper_lsl(uint32_t selector)
return limit; 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; int rpl, dpl, cpl, type;
selector &= 0xffff; selector = selector1 & 0xffff;
eflags = cc_table[CC_OP].compute_all(); eflags = cc_table[CC_OP].compute_all();
if ((selector & 0xfffc) == 0) if ((selector & 0xfffc) == 0)
goto fail; goto fail;
@ -3227,12 +3227,12 @@ uint32_t helper_lar(uint32_t selector)
return e2 & 0x00f0ff00; 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; int rpl, dpl, cpl;
selector &= 0xffff; selector = selector1 & 0xffff;
eflags = cc_table[CC_OP].compute_all(); eflags = cc_table[CC_OP].compute_all();
if ((selector & 0xfffc) == 0) if ((selector & 0xfffc) == 0)
goto fail; goto fail;
@ -3260,12 +3260,12 @@ void helper_verr(uint32_t selector)
CC_SRC = eflags | CC_Z; 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; int rpl, dpl, cpl;
selector &= 0xffff; selector = selector1 & 0xffff;
eflags = cc_table[CC_OP].compute_all(); eflags = cc_table[CC_OP].compute_all();
if ((selector & 0xfffc) == 0) if ((selector & 0xfffc) == 0)
goto fail; goto fail;

View File

@ -23,10 +23,10 @@ void helper_aas(void);
void helper_daa(void); void helper_daa(void);
void helper_das(void); void helper_das(void);
uint32_t helper_lsl(uint32_t selector); target_ulong helper_lsl(target_ulong selector1);
uint32_t helper_lar(uint32_t selector); target_ulong helper_lar(target_ulong selector1);
void helper_verr(uint32_t selector); void helper_verr(target_ulong selector1);
void helper_verw(uint32_t selector); void helper_verw(target_ulong selector1);
void helper_lldt(int selector); void helper_lldt(int selector);
void helper_ltr(int selector); void helper_ltr(int selector);
void helper_load_seg(int seg_reg, int selector); void helper_load_seg(int seg_reg, int selector);

View File

@ -167,34 +167,6 @@ void OPPROTO op_movl_T0_seg(void)
T0 = env->segs[PARAM1].selector; 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) void OPPROTO op_arpl(void)
{ {
if ((T0 & 3) < (T1 & 3)) { if ((T0 & 3) < (T1 & 3)) {

View File

@ -6333,9 +6333,9 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
if (s->cc_op != CC_OP_DYNAMIC) if (s->cc_op != CC_OP_DYNAMIC)
gen_op_set_cc_op(s->cc_op); gen_op_set_cc_op(s->cc_op);
if (op == 4) if (op == 4)
gen_op_verr(); tcg_gen_helper_0_1(helper_verr, cpu_T[0]);
else else
gen_op_verw(); tcg_gen_helper_0_1(helper_verw, cpu_T[0]);
s->cc_op = CC_OP_EFLAGS; s->cc_op = CC_OP_EFLAGS;
break; break;
default: default:
@ -6606,21 +6606,27 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
break; break;
case 0x102: /* lar */ case 0x102: /* lar */
case 0x103: /* lsl */ case 0x103: /* lsl */
if (!s->pe || s->vm86) {
goto illegal_op; int label1;
ot = dflag ? OT_LONG : OT_WORD; if (!s->pe || s->vm86)
modrm = ldub_code(s->pc++); goto illegal_op;
reg = ((modrm >> 3) & 7) | rex_r; ot = dflag ? OT_LONG : OT_WORD;
gen_ldst_modrm(s, modrm, ot, OR_TMP0, 0); modrm = ldub_code(s->pc++);
gen_op_mov_TN_reg(ot, 1, reg); reg = ((modrm >> 3) & 7) | rex_r;
if (s->cc_op != CC_OP_DYNAMIC) gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0);
gen_op_set_cc_op(s->cc_op); if (s->cc_op != CC_OP_DYNAMIC)
if (b == 0x102) gen_op_set_cc_op(s->cc_op);
gen_op_lar(); if (b == 0x102)
else tcg_gen_helper_1_1(helper_lar, cpu_T[0], cpu_T[0]);
gen_op_lsl(); else
s->cc_op = CC_OP_EFLAGS; tcg_gen_helper_1_1(helper_lsl, cpu_T[0], cpu_T[0]);
gen_op_mov_reg_T1(ot, reg); 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; break;
case 0x118: case 0x118:
modrm = ldub_code(s->pc++); modrm = ldub_code(s->pc++);