SMM fixes

This commit is contained in:
SarahW 2020-11-01 14:41:39 +00:00
commit 93756d3f01

View file

@ -3060,7 +3060,7 @@ void x86_smi_enter(void)
cpu_state.seg_cs.limit = 0xffffffff; cpu_state.seg_cs.limit = 0xffffffff;
cpu_state.seg_cs.limit_low = 0; cpu_state.seg_cs.limit_low = 0;
cpu_state.seg_cs.limit_high = 0xffffffff; cpu_state.seg_cs.limit_high = 0xffffffff;
cpu_state.seg_cs.access = (3 << 5) | 2; cpu_state.seg_cs.access = (0 << 5) | 2;
use32 = 0; use32 = 0;
stack32 = 0; stack32 = 0;
@ -3112,34 +3112,34 @@ void x86_smi_leave(void)
cpu_state.smbase = readmeml(0, cpu_state.smbase + 0x8000 + 0x7ef8); cpu_state.smbase = readmeml(0, cpu_state.smbase + 0x8000 + 0x7ef8);
cpl_override = 0; cpl_override = 0;
cr0 = new_cr0;
cpu_cur_status = 0; cpu_cur_status = 0;
if (cpu_state.seg_cs.access2 & 0x40) use32 = stack32 = 0;
{
cpu_cur_status |= CPU_STATUS_USE32;
use32 = 0x300;
}
else
use32 = 0;
if (cpu_state.seg_ss.access2 & 0x40)
{
cpu_cur_status |= CPU_STATUS_STACK32;
stack32 = 1;
}
else
stack32 = 0;
if (cr0 & 1) if (cr0 & 1)
{ {
cpu_cur_status |= CPU_STATUS_PMODE; cpu_cur_status |= CPU_STATUS_PMODE;
if (cpu_state.eflags & VM_FLAG) if (cpu_state.eflags & VM_FLAG)
cpu_cur_status |= CPU_STATUS_V86; cpu_cur_status |= CPU_STATUS_V86;
else
{
if (cpu_state.seg_cs.access2 & 0x40)
{
cpu_cur_status |= CPU_STATUS_USE32;
use32 = 0x300;
}
if (cpu_state.seg_ss.access2 & 0x40)
{
cpu_cur_status |= CPU_STATUS_STACK32;
stack32 = 1;
}
}
} }
if (cpu_state.seg_ds.base == 0 && cpu_state.seg_ds.limit_low == 0 && cpu_state.seg_ds.limit_high == 0xffffffff) if (cpu_state.seg_ds.base == 0 && cpu_state.seg_ds.limit_low == 0 && cpu_state.seg_ds.limit_high == 0xffffffff)
cpu_cur_status |= CPU_STATUS_NOTFLATDS; cpu_cur_status |= CPU_STATUS_NOTFLATDS;
if (cpu_state.seg_ss.base == 0 && cpu_state.seg_ss.limit_low == 0 && cpu_state.seg_ss.limit_high == 0xffffffff) if (cpu_state.seg_ss.base == 0 && cpu_state.seg_ss.limit_low == 0 && cpu_state.seg_ss.limit_high == 0xffffffff)
cpu_cur_status |= CPU_STATUS_NOTFLATSS; cpu_cur_status |= CPU_STATUS_NOTFLATSS;
cr0 = new_cr0;
if (smram_disable) if (smram_disable)
smram_disable(); smram_disable();
flushmmucache(); flushmmucache();