summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2026-02-21 10:29:05 -0600
committer cracyc <cracyc@users.noreply.github.com>2026-02-21 10:29:05 -0600
commit9c9da743c577dcc61b2060ef67db93bc9b421a6c (patch)
tree1a9c4e8ee8a6f8aedf691b0209e3e2e4c6a3859d /src/devices/cpu
parent1ba32aeed57f11b6b4b91e719ebd5bedc1ce1b32 (diff)
i386: fix smm
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/i386/i386.cpp9
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;
}