--- np2/i386c/ia32/instructions/system_inst.c 2004/01/26 15:23:55 1.10 +++ np2/i386c/ia32/instructions/system_inst.c 2004/02/05 16:43:45 1.14 @@ -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.14 2004/02/05 16:43:45 monaka Exp $ */ /* * Copyright (c) 2003 NONAKA Kimihiro @@ -44,14 +44,14 @@ LGDT_Ms(DWORD op) if (op < 0xc0) { if (!CPU_STAT_PM || !CPU_STAT_VM86 || CPU_STAT_CPL == 0) { CPU_WORKCLOCK(11); - madr = get_ea(op); + madr = calc_ea_dst(op); limit = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); base = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr + 2); if (!CPU_INST_OP32) { base &= 0x00ffffff; } -#if defined(DEBUG) +#if defined(MORE_DEBUG) gdtr_dump(base, limit); #endif @@ -79,7 +79,7 @@ SGDT_Ms(DWORD op) if (!CPU_INST_OP32) { base &= 0x00ffffff; } - madr = get_ea(op); + madr = calc_ea_dst(op); cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, limit); cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr + 2, base); return; @@ -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); @@ -198,14 +199,14 @@ LIDT_Ms(DWORD op) if (op < 0xc0) { if (!CPU_STAT_PM || !CPU_STAT_VM86 || CPU_STAT_CPL == 0) { CPU_WORKCLOCK(11); - madr = get_ea(op); + madr = calc_ea_dst(op); limit = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); base = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr + 2); if (!CPU_INST_OP32) { base &= 0x00ffffff; } -#if defined(DEBUG) +#if defined(MORE_DEBUG) idtr_dump(base, limit); #endif @@ -233,7 +234,7 @@ SIDT_Ms(DWORD op) if (!CPU_INST_OP32) { base &= 0x00ffffff; } - madr = get_ea(op); + madr = calc_ea_dst(op); cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, limit); cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr + 2, base); return; @@ -313,6 +314,8 @@ MOV_CdRd(void) change_pm(0); } } + + CPU_STAT_WP = (CPU_CR0 & CPU_CR0_WP) >> 12; break; case 2: /* CR2 */ @@ -524,6 +527,7 @@ LAR_GwEw(void) selector_t sel; WORD *out; DWORD op; + DWORD h; int rv; WORD selector; @@ -560,7 +564,8 @@ LAR_GwEw(void) } } - *out = sel.desc.h & 0xff00; + h = cpu_kmemoryread_d(sel.addr + 4); + *out = h & 0xff00; CPU_FLAGL |= Z_FLAG; return; } @@ -574,6 +579,7 @@ LAR_GdEw(void) selector_t sel; DWORD *out; DWORD op; + DWORD h; int rv; WORD selector; @@ -610,7 +616,8 @@ LAR_GdEw(void) } } - *out = sel.desc.h & 0x00ffff00; /* 0x00fxff00, x? */ + h = cpu_kmemoryread_d(sel.addr + 4); + *out = h & 0x00ffff00; /* 0x00fxff00, x? */ CPU_FLAGL |= Z_FLAG; return; } @@ -789,7 +796,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; } @@ -855,7 +862,7 @@ INVLPG(DWORD op) if (op < 0xc0) { CPU_WORKCLOCK(11); - madr = get_ea(op); + madr = calc_ea_dst(op); tlb_flush_page(madr); return; }