optimize x2apic reg write

This commit is contained in:
Stanislav Shwartsman 2012-05-12 19:07:18 +00:00
parent 08d4655886
commit ffc5e4bf2d
3 changed files with 6 additions and 8 deletions

View File

@ -1314,15 +1314,13 @@ bx_bool bx_local_apic_c::read_x2apic(unsigned index, Bit64u *val_64)
}
// return false when x2apic is not supported/not writeable
bx_bool bx_local_apic_c::write_x2apic(unsigned index, Bit64u val_64)
bx_bool bx_local_apic_c::write_x2apic(unsigned index, Bit32u val32_hi, Bit32u val32_lo)
{
Bit32u val32_lo = GET32L(val_64);
index = (index - 0x800) << 4;
if (index != BX_LAPIC_ICR_LO) {
// upper 32-bit are reserved for all x2apic MSRs except for the ICR
if (GET32H(val_64) != 0)
if (val32_hi != 0)
return 0;
}
@ -1367,7 +1365,7 @@ bx_bool bx_local_apic_c::write_x2apic(unsigned index, Bit64u val_64)
return 1;
case BX_LAPIC_ICR_LO:
// handle full 64-bit write
send_ipi(GET32H(val_64), val32_lo);
send_ipi(val32_hi, val32_lo);
return 1;
case BX_LAPIC_TPR:
// handle reserved bits, only bits 0-7 are writeable
@ -1382,7 +1380,7 @@ bx_bool bx_local_apic_c::write_x2apic(unsigned index, Bit64u val_64)
break; // use legacy write
case BX_LAPIC_EOI:
case BX_LAPIC_ESR:
if (val_64 != 0) return 0;
if (val32_lo != 0) return 0;
break; // use legacy write
case BX_LAPIC_LVT_TIMER:
case BX_LAPIC_LVT_THERMAL:

View File

@ -151,7 +151,7 @@ public:
Bit32u read_aligned(bx_phy_address address);
#if BX_CPU_LEVEL >= 6
bx_bool read_x2apic(unsigned index, Bit64u *msr);
bx_bool write_x2apic(unsigned index, Bit64u msr);
bx_bool write_x2apic(unsigned index, Bit32u msr_hi, Bit32u msr_lo);
#endif
// on local APIC, trigger means raise the CPU's INTR line. For now
// I also have to raise pc_system.INTR but that should be replaced

View File

@ -451,7 +451,7 @@ bx_bool BX_CPP_AttrRegparmN(2) BX_CPU_C::wrmsr(Bit32u index, Bit64u val_64)
if (bx_cpuid_support_x2apic()) {
if (index >= 0x800 && index <= 0xBFF) {
if (BX_CPU_THIS_PTR msr.apicbase & 0x400) // X2APIC mode
return BX_CPU_THIS_PTR lapic.write_x2apic(index, val_64);
return BX_CPU_THIS_PTR lapic.write_x2apic(index, val32_hi, val32_lo);
else
return 0;
}