i386: Signal a privilege change to the debugger whenever protected mode is enabled or disabled or the CS descriptor flags are changed

This commit is contained in:
AJR 2018-11-10 22:46:05 -05:00
parent aac19ebfba
commit 497fc4ad41
3 changed files with 15 additions and 5 deletions

View File

@ -417,11 +417,15 @@ void i386_device::i386_load_segment_descriptor(int segment )
{ {
if (PROTECTED_MODE) if (PROTECTED_MODE)
{ {
uint16_t old_flags = m_sreg[segment].flags;
if (!V8086_MODE) if (!V8086_MODE)
{ {
i386_load_protected_mode_segment(&m_sreg[segment], nullptr ); i386_load_protected_mode_segment(&m_sreg[segment], nullptr);
if(m_sreg[segment].selector) if (m_sreg[segment].selector)
{
i386_set_descriptor_accessed(m_sreg[segment].selector); i386_set_descriptor_accessed(m_sreg[segment].selector);
m_sreg[segment].flags |= 0x0001;
}
} }
else else
{ {
@ -431,6 +435,8 @@ void i386_device::i386_load_segment_descriptor(int segment )
m_sreg[segment].d = 0; m_sreg[segment].d = 0;
m_sreg[segment].valid = true; m_sreg[segment].valid = true;
} }
if (segment == CS && m_sreg[segment].flags != old_flags)
debugger_privilege_hook();
} }
else else
{ {
@ -438,11 +444,11 @@ void i386_device::i386_load_segment_descriptor(int segment )
m_sreg[segment].d = 0; m_sreg[segment].d = 0;
m_sreg[segment].valid = true; 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; m_sreg[segment].base |= 0xfff00000;
if(m_cpu_version < 0x500) if (m_cpu_version < 0x500)
m_sreg[segment].flags = 0x93; m_sreg[segment].flags = 0x93;
} }
} }

View File

@ -697,6 +697,8 @@ void i386_device::i386_mov_cr_r32() // Opcode 0x0f 22
case 0: case 0:
data &= 0xfffeffff; // wp not supported on 386 data &= 0xfffeffff; // wp not supported on 386
CYCLES(CYCLES_MOV_REG_CR0); CYCLES(CYCLES_MOV_REG_CR0);
if (PROTECTED_MODE != BIT(data, 0))
debugger_privilege_hook();
break; break;
case 2: CYCLES(CYCLES_MOV_REG_CR2); break; case 2: CYCLES(CYCLES_MOV_REG_CR2); break;
case 3: case 3:

View File

@ -514,6 +514,8 @@ void i386_device::i486_mov_cr_r32() // Opcode 0x0f 22
CYCLES(CYCLES_MOV_REG_CR0); CYCLES(CYCLES_MOV_REG_CR0);
if((oldcr ^ m_cr[cr]) & 0x80010000) if((oldcr ^ m_cr[cr]) & 0x80010000)
vtlb_flush_dynamic(); vtlb_flush_dynamic();
if (PROTECTED_MODE != BIT(data, 0))
debugger_privilege_hook();
break; break;
case 2: CYCLES(CYCLES_MOV_REG_CR2); break; case 2: CYCLES(CYCLES_MOV_REG_CR2); break;
case 3: case 3: