aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-04-08 14:55:18 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-04-08 14:55:18 +0200
commit2ed34cc51a534171f0fe08808634834bc22cf84d (patch)
tree5b0bdbbf7b7377586935261aa141b3202cb8a431 /arch
parent296742bfa509524dc8effc3dcae4b6231d37705f (diff)
downloadteachos-2ed34cc51a534171f0fe08808634834bc22cf84d.tar.xz
teachos-2ed34cc51a534171f0fe08808634834bc22cf84d.zip
x86_64: only initialize BSP LAPIC
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/include/arch/devices/local_apic.hpp4
-rw-r--r--arch/x86_64/kapi/platform.cpp6
-rw-r--r--arch/x86_64/src/devices/local_apic.cpp30
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;
}