mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-29 15:57:59 +00:00
Added memory barriers
This commit is contained in:
parent
4e45305099
commit
21478ca5b8
@ -45,7 +45,12 @@ namespace APIC
|
|||||||
return CPU::x64::rdmsr(0x30 + 0x800);
|
return CPU::x64::rdmsr(0x30 + 0x800);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return *((volatile uint32_t *)((uintptr_t)((ACPI::MADT *)PowerManager->GetMADT())->LAPICAddress + Register));
|
{
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
uint32_t ret = *((volatile uint32_t *)((uintptr_t)((ACPI::MADT *)PowerManager->GetMADT())->LAPICAddress + Register));
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void APIC::Write(uint32_t Register, uint32_t Value)
|
void APIC::Write(uint32_t Register, uint32_t Value)
|
||||||
@ -63,21 +68,32 @@ namespace APIC
|
|||||||
CPU::x64::wrmsr(CPU::x64::MSR_X2APIC_ICR, Value);
|
CPU::x64::wrmsr(CPU::x64::MSR_X2APIC_ICR, Value);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
*((volatile uint32_t *)(((uintptr_t)((ACPI::MADT *)PowerManager->GetMADT())->LAPICAddress) + Register)) = Value;
|
*((volatile uint32_t *)(((uintptr_t)((ACPI::MADT *)PowerManager->GetMADT())->LAPICAddress) + Register)) = Value;
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void APIC::IOWrite(uint64_t Base, uint32_t Register, uint32_t Value)
|
void APIC::IOWrite(uint64_t Base, uint32_t Register, uint32_t Value)
|
||||||
{
|
{
|
||||||
debug("APIC::IOWrite(%#lx, %#lx, %#lx)", Base, Register, Value);
|
debug("APIC::IOWrite(%#lx, %#lx, %#lx)", Base, Register, Value);
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
*((volatile uint32_t *)(((uintptr_t)Base))) = Register;
|
*((volatile uint32_t *)(((uintptr_t)Base))) = Register;
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
*((volatile uint32_t *)(((uintptr_t)Base + 16))) = Value;
|
*((volatile uint32_t *)(((uintptr_t)Base + 16))) = Value;
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t APIC::IORead(uint64_t Base, uint32_t Register)
|
uint32_t APIC::IORead(uint64_t Base, uint32_t Register)
|
||||||
{
|
{
|
||||||
debug("APIC::IORead(%#lx, %#lx)", Base, Register);
|
debug("APIC::IORead(%#lx, %#lx)", Base, Register);
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
*((volatile uint32_t *)(((uintptr_t)Base))) = Register;
|
*((volatile uint32_t *)(((uintptr_t)Base))) = Register;
|
||||||
return *((volatile uint32_t *)(((uintptr_t)Base + 16)));
|
CPU::MemBar::Barrier();
|
||||||
|
uint32_t ret = *((volatile uint32_t *)(((uintptr_t)Base + 16)));
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void APIC::EOI() { this->Write(APIC_EOI, 0); }
|
void APIC::EOI() { this->Write(APIC_EOI, 0); }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user