Don't set oldcpl at the start of each instruction; instead, only set it following a successful CS load.

This commit is contained in:
SarahW 2019-01-27 20:51:13 +00:00
commit c3250ca63e
4 changed files with 18 additions and 5 deletions

View file

@ -238,7 +238,6 @@ void exec386(int cycs)
oldcs=CS;
cpu_state.oldpc = cpu_state.pc;
oldcpl=CPL;
cpu_state.op32 = use32;
dontprint=0;

View file

@ -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;

View file

@ -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;

View file

@ -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;