diff --git a/src/devices/cpu/i386/i386.cpp b/src/devices/cpu/i386/i386.cpp index 7a86fdc8b4c..68781154970 100644 --- a/src/devices/cpu/i386/i386.cpp +++ b/src/devices/cpu/i386/i386.cpp @@ -417,11 +417,15 @@ void i386_device::i386_load_segment_descriptor(int segment ) { if (PROTECTED_MODE) { + uint16_t old_flags = m_sreg[segment].flags; if (!V8086_MODE) { - i386_load_protected_mode_segment(&m_sreg[segment], nullptr ); - if(m_sreg[segment].selector) + i386_load_protected_mode_segment(&m_sreg[segment], nullptr); + if (m_sreg[segment].selector) + { i386_set_descriptor_accessed(m_sreg[segment].selector); + m_sreg[segment].flags |= 0x0001; + } } else { @@ -431,6 +435,8 @@ void i386_device::i386_load_segment_descriptor(int segment ) m_sreg[segment].d = 0; m_sreg[segment].valid = true; } + if (segment == CS && m_sreg[segment].flags != old_flags) + debugger_privilege_hook(); } else { @@ -438,11 +444,11 @@ void i386_device::i386_load_segment_descriptor(int segment ) m_sreg[segment].d = 0; m_sreg[segment].valid = true; - if( segment == CS ) + if (segment == CS) { - if( !m_performed_intersegment_jump ) + if (!m_performed_intersegment_jump) m_sreg[segment].base |= 0xfff00000; - if(m_cpu_version < 0x500) + if (m_cpu_version < 0x500) m_sreg[segment].flags = 0x93; } } diff --git a/src/devices/cpu/i386/i386ops.hxx b/src/devices/cpu/i386/i386ops.hxx index 5940b2b401c..5b9d21a1c94 100644 --- a/src/devices/cpu/i386/i386ops.hxx +++ b/src/devices/cpu/i386/i386ops.hxx @@ -697,6 +697,8 @@ void i386_device::i386_mov_cr_r32() // Opcode 0x0f 22 case 0: data &= 0xfffeffff; // wp not supported on 386 CYCLES(CYCLES_MOV_REG_CR0); + if (PROTECTED_MODE != BIT(data, 0)) + debugger_privilege_hook(); break; case 2: CYCLES(CYCLES_MOV_REG_CR2); break; case 3: diff --git a/src/devices/cpu/i386/i486ops.hxx b/src/devices/cpu/i386/i486ops.hxx index 37c8ee8d1c2..77e9ee3dd2d 100644 --- a/src/devices/cpu/i386/i486ops.hxx +++ b/src/devices/cpu/i386/i486ops.hxx @@ -514,6 +514,8 @@ void i386_device::i486_mov_cr_r32() // Opcode 0x0f 22 CYCLES(CYCLES_MOV_REG_CR0); if((oldcr ^ m_cr[cr]) & 0x80010000) vtlb_flush_dynamic(); + if (PROTECTED_MODE != BIT(data, 0)) + debugger_privilege_hook(); break; case 2: CYCLES(CYCLES_MOV_REG_CR2); break; case 3: