--- np2/i386c/ia32/instructions/system_inst.c 2004/01/26 15:23:55 1.10 +++ np2/i386c/ia32/instructions/system_inst.c 2004/02/04 13:24:35 1.13 @@ -1,4 +1,4 @@ -/* $Id: system_inst.c,v 1.10 2004/01/26 15:23:55 monaka Exp $ */ +/* $Id: system_inst.c,v 1.13 2004/02/04 13:24:35 monaka Exp $ */ /* * Copyright (c) 2003 NONAKA Kimihiro @@ -51,7 +51,7 @@ LGDT_Ms(DWORD op) base &= 0x00ffffff; } -#if defined(DEBUG) +#if defined(MORE_DEBUG) gdtr_dump(base, limit); #endif @@ -183,6 +183,7 @@ STR_Ew(DWORD op) madr = calc_ea_dst(op); cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, tr); } + return; } VERBOSE(("STR: VM86")); EXCEPTION(UD_EXCEPTION, 0); @@ -205,7 +206,7 @@ LIDT_Ms(DWORD op) base &= 0x00ffffff; } -#if defined(DEBUG) +#if defined(MORE_DEBUG) idtr_dump(base, limit); #endif @@ -524,13 +525,16 @@ LAR_GwEw(void) selector_t sel; WORD *out; DWORD op; + DWORD h; + int user_mode; int rv; WORD selector; if (CPU_STAT_PM && !CPU_STAT_VM86) { PREPART_REG16_EA(op, selector, out, 5, 11); - rv = parse_selector(&sel, selector); + user_mode = CPU_IS_USER_MODE(); + rv = parse_selector(&sel, selector, user_mode); if (rv < 0) { CPU_FLAGL &= ~Z_FLAG; return; @@ -560,7 +564,8 @@ LAR_GwEw(void) } } - *out = sel.desc.h & 0xff00; + h = cpu_lmemoryread_d(sel.addr + 4, user_mode); + *out = h & 0xff00; CPU_FLAGL |= Z_FLAG; return; } @@ -574,13 +579,16 @@ LAR_GdEw(void) selector_t sel; DWORD *out; DWORD op; + DWORD h; + int user_mode; int rv; WORD selector; if (CPU_STAT_PM && !CPU_STAT_VM86) { PREPART_REG32_EA(op, selector, out, 5, 11); - rv = parse_selector(&sel, selector); + user_mode = CPU_IS_USER_MODE(); + rv = parse_selector(&sel, selector, user_mode); if (rv < 0) { CPU_FLAGL &= ~Z_FLAG; return; @@ -610,7 +618,8 @@ LAR_GdEw(void) } } - *out = sel.desc.h & 0x00ffff00; /* 0x00fxff00, x? */ + h = cpu_lmemoryread_d(sel.addr + 4, user_mode); + *out = h & 0x00ffff00; /* 0x00fxff00, x? */ CPU_FLAGL |= Z_FLAG; return; } @@ -630,7 +639,7 @@ LSL_GwEw(void) if (CPU_STAT_PM && !CPU_STAT_VM86) { PREPART_REG16_EA(op, selector, out, 5, 11); - rv = parse_selector(&sel, selector); + rv = parse_selector(&sel, selector, CPU_IS_USER_MODE()); if (rv < 0) { CPU_FLAGL &= ~Z_FLAG; return; @@ -677,7 +686,7 @@ LSL_GdEw(void) if (CPU_STAT_PM && !CPU_STAT_VM86) { PREPART_REG32_EA(op, selector, out, 5, 11); - rv = parse_selector(&sel, selector); + rv = parse_selector(&sel, selector, CPU_IS_USER_MODE()); if (rv < 0) { CPU_FLAGL &= ~Z_FLAG; return; @@ -730,7 +739,7 @@ VERR_Ew(DWORD op) selector = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); } - rv = parse_selector(&sel, selector); + rv = parse_selector(&sel, selector, CPU_IS_USER_MODE()); if (rv < 0) { CPU_FLAGL &= ~Z_FLAG; return; @@ -777,7 +786,7 @@ VERW_Ew(DWORD op) selector = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); } - rv = parse_selector(&sel, selector); + rv = parse_selector(&sel, selector, CPU_IS_USER_MODE()); if (rv < 0) { CPU_FLAGL &= ~Z_FLAG; return; @@ -789,7 +798,7 @@ VERW_Ew(DWORD op) return; } /* data segment is not writable */ - if (sel.desc.u.seg.c && !sel.desc.u.seg.wr) { + if (!sel.desc.u.seg.wr) { CPU_FLAGL &= ~Z_FLAG; return; }