diff options
| -rw-r--r-- | arch/x86_64/include/arch/devices/local_apic.hpp | 4 | ||||
| -rw-r--r-- | arch/x86_64/kapi/platform.cpp | 6 | ||||
| -rw-r--r-- | arch/x86_64/src/devices/local_apic.cpp | 30 |
3 files changed, 29 insertions, 11 deletions
diff --git a/arch/x86_64/include/arch/devices/local_apic.hpp b/arch/x86_64/include/arch/devices/local_apic.hpp index 7f125c3..7ae0a02 100644 --- a/arch/x86_64/include/arch/devices/local_apic.hpp +++ b/arch/x86_64/include/arch/devices/local_apic.hpp @@ -12,7 +12,8 @@ namespace arch::devices struct local_apic : kapi::devices::device { - local_apic(std::size_t major, std::size_t minor, std::uint64_t hardware_id, kapi::memory::physical_address base); + local_apic(std::size_t major, std::size_t minor, std::uint64_t hardware_id, kapi::memory::physical_address base, + bool is_bsp); auto init() -> bool override; @@ -23,6 +24,7 @@ namespace arch::devices std::uint64_t m_hardware_id{}; kapi::memory::physical_address m_base{}; kapi::memory::linear_address m_virtual_base{}; + bool m_is_bsp{}; }; } // namespace arch::devices diff --git a/arch/x86_64/kapi/platform.cpp b/arch/x86_64/kapi/platform.cpp index c6e41d2..d881f8a 100644 --- a/arch/x86_64/kapi/platform.cpp +++ b/arch/x86_64/kapi/platform.cpp @@ -44,9 +44,9 @@ namespace kapi::platform { auto is_bsp = !bsp_found; bsp_found = true; - auto lapic = kstd::make_unique<arch::devices::local_apic>(interrupt_controller_major, core_index, - local_apic->apic_id(), - real_madt->local_interrupt_controller_address()); + auto lapic = kstd::make_unique<arch::devices::local_apic>( + interrupt_controller_major, core_index, local_apic->apic_id(), + real_madt->local_interrupt_controller_address(), is_bsp); if (kapi::platform::cpu_detected(bus, core_major, core_index, local_apic->processor_id(), is_bsp, std::move(lapic))) { diff --git a/arch/x86_64/src/devices/local_apic.cpp b/arch/x86_64/src/devices/local_apic.cpp index 91e907a..e24e1d4 100644 --- a/arch/x86_64/src/devices/local_apic.cpp +++ b/arch/x86_64/src/devices/local_apic.cpp @@ -20,24 +20,40 @@ namespace arch::devices } // namespace local_apic::local_apic(std::size_t major, std::size_t minor, std::uint64_t hardware_id, - kapi::memory::physical_address base) + kapi::memory::physical_address base, bool is_bsp) : kapi::devices::device{major, minor, "lapic"} , m_hardware_id{hardware_id} , m_base{base} + , m_is_bsp{is_bsp} {} auto local_apic::init() -> bool { - m_virtual_base = kapi::memory::allocate_mmio_region(1); - if (!kapi::memory::map_mmio_region(m_virtual_base, m_base, kapi::memory::page_mapper::flags::writable)) + auto static shared_virtual_base = kapi::memory::allocate_mmio_region(1); + auto static is_mapped = false; + + if (!is_mapped) { - kstd::println("[x86_64:DEV] LAPIC {} MMIO mapping failed!", m_hardware_id); - return false; + if (!kapi::memory::map_mmio_region(shared_virtual_base, m_base, kapi::memory::page_mapper::flags::writable)) + { + kstd::println("[x86_64:DEV] LAPIC {} MMIO mapping failed!", m_hardware_id); + return false; + } + is_mapped = true; } - write_register(lapic_sivr_register, lapic_enable_bit | spurious_interrupt_vector); + m_virtual_base = shared_virtual_base; + + if (m_is_bsp) + { + write_register(lapic_sivr_register, lapic_enable_bit | spurious_interrupt_vector); - kstd::println("[x86_64:DEV] LAPIC {} initialized. {:#018x}@{:#018x}", m_hardware_id, m_base, m_virtual_base); + kstd::println("[x86_64:DEV] LAPIC {} initialized. {:#018x}@{:#018x}", m_hardware_id, m_base, m_virtual_base); + } + else + { + kstd::println("[x86_64:DEV] LAPIC {} is not on the BSP, deferring intialization.", m_hardware_id); + } return true; } |
