diff options
| author | 2026-02-21 10:29:05 -0600 | |
|---|---|---|
| committer | 2026-02-21 10:29:05 -0600 | |
| commit | 9c9da743c577dcc61b2060ef67db93bc9b421a6c (patch) | |
| tree | 1a9c4e8ee8a6f8aedf691b0209e3e2e4c6a3859d /src/devices/cpu | |
| parent | 1ba32aeed57f11b6b4b91e719ebd5bedc1ce1b32 (diff) | |
i386: fix smm
Diffstat (limited to 'src/devices/cpu')
| -rw-r--r-- | src/devices/cpu/i386/i386.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/devices/cpu/i386/i386.cpp b/src/devices/cpu/i386/i386.cpp index 99b7846ca0b..3f6114b20ce 100644 --- a/src/devices/cpu/i386/i386.cpp +++ b/src/devices/cpu/i386/i386.cpp @@ -2610,14 +2610,17 @@ void i386_device::enter_smm() m_sreg[DS].limit = m_sreg[ES].limit = m_sreg[FS].limit = m_sreg[GS].limit = m_sreg[SS].limit = 0xffffffff; m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x8093; m_sreg[DS].valid = m_sreg[ES].valid = m_sreg[FS].valid = m_sreg[GS].valid = m_sreg[SS].valid = true; + m_sreg[DS].d = m_sreg[ES].d = m_sreg[FS].d = m_sreg[GS].d = m_sreg[SS].d = 0; m_sreg[CS].selector = 0x3000; // pentium only, ppro sel = smbase >> 4 m_sreg[CS].base = m_smbase; m_sreg[CS].limit = 0xffffffff; m_sreg[CS].flags = 0x8093; m_sreg[CS].valid = true; + m_sreg[CS].d = 0; m_cr[4] = 0; m_dr[7] = 0x400; m_eip = 0x8000; + m_CPL = 0; m_nmi_masked = true; CHANGE_PC(m_eip); @@ -2683,15 +2686,13 @@ void i386_device::leave_smm() m_cr[3] = READ32(smram_state + SMRAM_CR3); m_cr[0] = READ32(smram_state + SMRAM_CR0); - m_CPL = (m_sreg[SS].flags >> 13) & 3; // cpl == dpl of ss + m_CPL = (m_sreg[SS].flags >> 12) & 3; // cpl == dpl of ss for (int i = 0; i <= GS; i++) { + m_sreg[i].d = (m_sreg[i].flags & 0x4000) ? 1 : 0; if (PROTECTED_MODE && !V8086_MODE) - { m_sreg[i].valid = m_sreg[i].selector ? true : false; - m_sreg[i].d = (m_sreg[i].flags & 0x4000) ? 1 : 0; - } else m_sreg[i].valid = true; } |
