From 21478ca5b8b707d5e39ea622e3f739abdf93c02d Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 23 Oct 2022 02:24:07 +0300 Subject: [PATCH] Added memory barriers --- ...dvancedProgrammableInterruptController.cpp | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Architecture/amd64/cpu/AdvancedProgrammableInterruptController.cpp b/Architecture/amd64/cpu/AdvancedProgrammableInterruptController.cpp index 724c431..cc9e16c 100644 --- a/Architecture/amd64/cpu/AdvancedProgrammableInterruptController.cpp +++ b/Architecture/amd64/cpu/AdvancedProgrammableInterruptController.cpp @@ -45,7 +45,12 @@ namespace APIC return CPU::x64::rdmsr(0x30 + 0x800); } 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) @@ -63,21 +68,32 @@ namespace APIC CPU::x64::wrmsr(CPU::x64::MSR_X2APIC_ICR, Value); } else + { + CPU::MemBar::Barrier(); *((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) { debug("APIC::IOWrite(%#lx, %#lx, %#lx)", Base, Register, Value); + CPU::MemBar::Barrier(); *((volatile uint32_t *)(((uintptr_t)Base))) = Register; + CPU::MemBar::Barrier(); *((volatile uint32_t *)(((uintptr_t)Base + 16))) = Value; + CPU::MemBar::Barrier(); } uint32_t APIC::IORead(uint64_t Base, uint32_t Register) { debug("APIC::IORead(%#lx, %#lx)", Base, Register); + CPU::MemBar::Barrier(); *((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); }