integrate random fixes done during WAITPKG feature development

This commit is contained in:
Stanislav Shwartsman 2023-11-25 16:53:00 +02:00
parent 280303d76c
commit 14fc5635de
3 changed files with 13 additions and 8 deletions

View File

@ -1202,9 +1202,11 @@ void bx_local_apic_c::vmx_preemption_timer_expired(void *this_ptr)
void bx_local_apic_c::set_mwaitx_timer(Bit64u value)
{
if (mwaitx_timer_active) deactivate_mwaitx_timer();
BX_DEBUG(("MWAITX timer: value = %u", value));
bx_pc_system.activate_timer_ticks(mwaitx_timer_handle, value, 0);
mwaitx_timer_active = true;
if (value) {
BX_DEBUG(("MWAITX timer: delay value = " FMT_LL "u", value));
bx_pc_system.activate_timer_ticks(mwaitx_timer_handle, value, 0);
mwaitx_timer_active = true;
}
}
void bx_local_apic_c::deactivate_mwaitx_timer(void)

View File

@ -48,8 +48,8 @@ x86_feature(BX_ISA_SSE4_1, "sse4_1") /* SSE4_
x86_feature(BX_ISA_SSE4_2, "sse4_2") /* SSE4_2 instruction */
x86_feature(BX_ISA_POPCNT, "popcnt") /* POPCNT instruction */
x86_feature(BX_ISA_MONITOR_MWAIT, "mwait") /* MONITOR/MWAIT instruction */
x86_feature(BX_ISA_MONITORX_MWAITX, "mwaitx") /* MONITORX/MWAITX instruction (AMD) */
x86_feature(BX_ISA_WAITPKG, "waitpkg") /* TPAUSE/UMONITOR/UMWAIT instructions */
x86_feature(BX_ISA_MONITORX_MWAITX, "mwaitx") /* MONITORX/MWAITX instruction (AMD) */
x86_feature(BX_ISA_VMX, "vmx") /* VMX instruction */
x86_feature(BX_ISA_SMX, "smx") /* SMX instruction */
x86_feature(BX_ISA_LONG_MODE, "longmode") /* Long Mode (x86-64) support */

View File

@ -58,13 +58,15 @@ void BX_CPU_C::wakeup_monitor(void)
BX_CPU_THIS_PTR activity_state = BX_ACTIVITY_STATE_ACTIVE;
// clear monitor
BX_CPU_THIS_PTR monitor.reset_monitor();
// deactivate mwaitx timer if was active to avoid its redundant firing
BX_CPU_THIS_PTR lapic.deactivate_mwaitx_timer();
}
#endif
void BX_CPP_AttrRegparmN(1) BX_CPU_C::MONITOR(bxInstruction_c *i)
{
#if BX_SUPPORT_MONITOR_MWAIT
BX_DEBUG(("%s instruction executed EAX = 0x%08x", i->getIaOpcodeNameShort(), EAX));
BX_DEBUG(("%s instruction executed RAX = 0x" FMT_ADDRX, i->getIaOpcodeNameShort(), RAX));
if (i->getIaOpcode() == BX_IA_MONITOR) {
// CPL is always 0 in real mode
@ -95,6 +97,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::MONITOR(bxInstruction_c *i)
bx_phy_address paddr = BX_CPU_THIS_PTR address_xlation.paddress1;
#if BX_SUPPORT_MEMTYPE
if (BX_CPU_THIS_PTR address_xlation.memtype1 != BX_MEMTYPE_WB) {
BX_DEBUG(("%s for non-WB memory type phys_addr=0x" FMT_PHY_ADDRX, i->getIaOpcodeNameShort(), BX_CPU_THIS_PTR monitor.monitor_addr));
BX_NEXT_INSTR(i);
}
#endif
@ -184,7 +187,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::MWAIT(bxInstruction_c *i)
// resets the monitoring logic.
Bit32u new_state = BX_ACTIVITY_STATE_MWAIT;
if (ECX & 1) {
if (ECX & 0x1) {
#if BX_SUPPORT_VMX
// When "interrupt window exiting" VMX control is set MWAIT instruction
// won't cause the processor to enter sleep state with EFLAGS.IF = 0
@ -199,8 +202,8 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::MWAIT(bxInstruction_c *i)
BX_INSTR_MWAIT(BX_CPU_ID, BX_CPU_THIS_PTR monitor.monitor_addr, CACHE_LINE_SIZE, ECX);
if (ECX & 2) {
if (i->getIaOpcode() == BX_IA_MWAITX) {
if (i->getIaOpcode() == BX_IA_MWAITX) {
if ((ECX & 0x2) != 0 && EBX != 0) {
BX_CPU_THIS_PTR lapic.set_mwaitx_timer(EBX);
}
}