diff --git a/src/386.c b/src/386.c index e7032d1..8d18d9a 100644 --- a/src/386.c +++ b/src/386.c @@ -238,7 +238,6 @@ void exec386(int cycs) oldcs=CS; cpu_state.oldpc = cpu_state.pc; - oldcpl=CPL; cpu_state.op32 = use32; dontprint=0; diff --git a/src/386_dynarec.c b/src/386_dynarec.c index 1238cc0..77bba42 100644 --- a/src/386_dynarec.c +++ b/src/386_dynarec.c @@ -533,7 +533,6 @@ void exec386_dynarec(int cycs) { oldcs = CS; cpu_state.oldpc = cpu_state.pc; - oldcpl = CPL; cpu_state.op32 = use32; @@ -549,7 +548,6 @@ void exec386_dynarec(int cycs) { oldcs=CS; cpu_state.oldpc = cpu_state.pc; - oldcpl=CPL; cpu_state.op32 = use32; cpu_state.ea_seg = &cpu_state.seg_ds; @@ -708,7 +706,6 @@ inrecomp=0; { oldcs=CS; cpu_state.oldpc = cpu_state.pc; - oldcpl=CPL; cpu_state.op32 = use32; cpu_state.ea_seg = &cpu_state.seg_ds; @@ -790,7 +787,6 @@ inrecomp=0; { oldcs=CS; cpu_state.oldpc = cpu_state.pc; - oldcpl=CPL; cpu_state.op32 = use32; cpu_state.ea_seg = &cpu_state.seg_ds; diff --git a/src/x86_ops_misc.h b/src/x86_ops_misc.h index ee6c632..ca11638 100644 --- a/src/x86_ops_misc.h +++ b/src/x86_ops_misc.h @@ -925,6 +925,7 @@ static int opLOADALL386(uint32_t fetchdat) loadall_load_segment(la_addr + 0xc0, &cpu_state.seg_es); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; CLOCK_CYCLES(350); return 0; diff --git a/src/x86seg.c b/src/x86seg.c index 547ed1b..012e930 100644 --- a/src/x86seg.c +++ b/src/x86seg.c @@ -573,6 +573,7 @@ void loadcs(uint16_t seg) do_seg_load(&cpu_state.seg_cs, segdat); use32=(segdat[3]&0x40)?0x300:0; if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; #ifdef CS_ACCESSED cpl_override = 1; @@ -611,6 +612,7 @@ void loadcs(uint16_t seg) if (cpu_state.eflags&VM_FLAG) cpu_state.seg_cs.access=(3<<5) | 2; else cpu_state.seg_cs.access=(0<<5) | 2; if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; } } @@ -697,6 +699,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc) do_seg_load(&cpu_state.seg_cs, segdat); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; /* if (segdat[3]&0x40) { use32=0x300; @@ -801,6 +804,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc) CS=seg2; do_seg_load(&cpu_state.seg_cs, segdat); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; set_use32(segdat[3]&0x40); cpu_state.pc=newpc; @@ -856,6 +860,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc) if (cpu_state.eflags&VM_FLAG) cpu_state.seg_cs.access=(3<<5) | 2; else cpu_state.seg_cs.access=(0<<5) | 2; if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; cycles -= timing_jmp_rm; } } @@ -1032,6 +1037,7 @@ void loadcscall(uint16_t seg) CS=seg; do_seg_load(&cpu_state.seg_cs, segdat); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; /* if (segdat[3]&0x40) { use32=0x300; @@ -1220,6 +1226,7 @@ void loadcscall(uint16_t seg) CS=seg2; do_seg_load(&cpu_state.seg_cs, segdat); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; set_use32(segdat[3]&0x40); cpu_state.pc=newpc; @@ -1324,6 +1331,7 @@ void loadcscall(uint16_t seg) CS=seg2; do_seg_load(&cpu_state.seg_cs, segdat); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; set_use32(segdat[3]&0x40); cpu_state.pc=newpc; @@ -1373,6 +1381,7 @@ void loadcscall(uint16_t seg) if (cpu_state.eflags&VM_FLAG) cpu_state.seg_cs.access=(3<<5) | 2; else cpu_state.seg_cs.access=(0<<5) | 2; if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; } } @@ -1500,6 +1509,7 @@ void pmoderetf(int is32, uint16_t off) do_seg_load(&cpu_state.seg_cs, segdat); cpu_state.seg_cs.access = (cpu_state.seg_cs.access & ~(3 << 5)) | ((CS & 3) << 5); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; set_use32(segdat[3] & 0x40); // pclog("CPL=RPL return to %04X:%08X\n",CS,pc); @@ -1651,6 +1661,7 @@ void pmoderetf(int is32, uint16_t off) CS=seg; do_seg_load(&cpu_state.seg_cs, segdat); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; set_use32(segdat[3] & 0x40); if (stack32) ESP+=off; @@ -1982,6 +1993,7 @@ void pmodeint(int num, int soft) cpu_state.seg_cs.access = (cpu_state.seg_cs.access & ~(3 << 5)) | (new_cpl << 5); // pclog("New CS = %04X\n",CS); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; if (type>0x800) cpu_state.pc=segdat[0]|(segdat[3]<<16); else cpu_state.pc=segdat[0]; set_use32(segdat2[3]&0x40); @@ -2178,6 +2190,7 @@ void pmodeiret(int is32) CS=seg; cpu_state.seg_cs.access=(3<<5) | 2; if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; ESP=newsp; loadseg(newss,&cpu_state.seg_ss); @@ -2297,6 +2310,7 @@ void pmodeiret(int is32) do_seg_load(&cpu_state.seg_cs, segdat); cpu_state.seg_cs.access = (cpu_state.seg_cs.access & ~(3 << 5)) | ((CS & 3) << 5); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; set_use32(segdat[3]&0x40); #ifdef CS_ACCESSED @@ -2413,6 +2427,7 @@ void pmodeiret(int is32) do_seg_load(&cpu_state.seg_cs, segdat); cpu_state.seg_cs.access = (cpu_state.seg_cs.access & ~(3 << 5)) | ((CS & 3) << 5); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; set_use32(segdat[3] & 0x40); check_seg_valid(&cpu_state.seg_ds); @@ -2647,6 +2662,7 @@ void taskswitch286(uint16_t seg, uint16_t *segdat, int is32) CS=new_cs; do_seg_load(&cpu_state.seg_cs, segdat2); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; set_use32(segdat2[3] & 0x40); cpu_cur_status &= ~CPU_STATUS_V86; } @@ -2847,6 +2863,7 @@ void taskswitch286(uint16_t seg, uint16_t *segdat, int is32) CS=new_cs; do_seg_load(&cpu_state.seg_cs, segdat2); if (CPL==3 && oldcpl!=3) flushmmucache_cr3(); + oldcpl = CPL; set_use32(0); EAX=new_eax | 0xFFFF0000;