From 8d08b3b905d211e989848e1abf3a8ff2535836c8 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 6 Apr 2026 18:13:21 +0200 Subject: kapi: extract more code to the kernel --- kernel/kapi/devices/bus.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++ kernel/kapi/devices/device.cpp | 35 +++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 kernel/kapi/devices/bus.cpp create mode 100644 kernel/kapi/devices/device.cpp (limited to 'kernel/kapi/devices') diff --git a/kernel/kapi/devices/bus.cpp b/kernel/kapi/devices/bus.cpp new file mode 100644 index 0000000..68874c4 --- /dev/null +++ b/kernel/kapi/devices/bus.cpp @@ -0,0 +1,65 @@ +#include "kapi/devices/bus.hpp" + +#include "kapi/devices.hpp" +#include "kapi/system.hpp" + +#include +#include +#include +#include + +#include +#include +#include + +namespace kapi::devices +{ + bus::bus(std::size_t major, std::size_t minor, kstd::string const & name) + : device(major, minor, name) + {} + + auto bus::init() -> bool + { + if (m_initialized.test_and_set()) + { + return true; + } + + if (!probe()) + { + return false; + } + + return std::ranges::fold_left(m_devices, true, [&](bool acc, auto & child) -> bool { + kstd::println("[OS:DEV] Initializing child device {}@{}", child->name(), name()); + return child->init() && acc; + }); + } + + auto bus::add_child(kstd::unique_ptr child) -> void + { + auto observer = m_observers.emplace_back(child.get()); + m_devices.push_back(std::move(child)); + kapi::devices::register_device(*observer); + + if (m_initialized.test()) + { + kstd::println("[OS:DEV] Initializing child device {}@{}", observer->name(), name()); + if (!observer->init()) + { + kapi::system::panic("[OS:DEV] Failed to initialize child device"); + } + } + } + + [[nodiscard]] auto bus::children() const -> kstd::vector> const & + { + return m_observers; + } + + auto bus::probe() -> bool + { + return true; + } + +} // namespace kapi::devices \ No newline at end of file diff --git a/kernel/kapi/devices/device.cpp b/kernel/kapi/devices/device.cpp new file mode 100644 index 0000000..9f7a404 --- /dev/null +++ b/kernel/kapi/devices/device.cpp @@ -0,0 +1,35 @@ +#include "kapi/devices/device.hpp" + +#include + +#include + +namespace kapi::devices +{ + device::device(size_t major, size_t minor, kstd::string const & name) + : m_major(major) + , m_minor(minor) + , m_name(name) + {} + + [[nodiscard]] auto device::major() const -> size_t + { + return m_major; + } + + [[nodiscard]] auto device::minor() const -> size_t + { + return m_minor; + } + + [[nodiscard]] auto device::name() const -> kstd::string const & + { + return m_name; + } + + [[nodiscard]] auto device::is_block_device() const -> bool + { + return false; + } + +} // namespace kapi::devices \ No newline at end of file -- cgit v1.2.3 From 0e92017837490d3ce806cf511977ada06d11a2a7 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Wed, 8 Apr 2026 15:50:48 +0200 Subject: kapi/bus: fix eager initialization --- kernel/kapi/devices/bus.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'kernel/kapi/devices') diff --git a/kernel/kapi/devices/bus.cpp b/kernel/kapi/devices/bus.cpp index 68874c4..66b84d2 100644 --- a/kernel/kapi/devices/bus.cpp +++ b/kernel/kapi/devices/bus.cpp @@ -20,20 +20,26 @@ namespace kapi::devices auto bus::init() -> bool { - if (m_initialized.test_and_set()) + if (m_init_was_called.test_and_set()) { + kstd::println(kstd::print_sink::stderr, "[OS:DEV] Bus {}:{}:{} already initialized", name(), major(), minor()); return true; } if (!probe()) { + kstd::println(kstd::print_sink::stderr, "[OS:DEV] Bus {}:{}:{} probe failed", name(), major(), minor()); return false; } - return std::ranges::fold_left(m_devices, true, [&](bool acc, auto & child) -> bool { + auto child_status = std::ranges::fold_left(m_devices, true, [&](bool acc, auto & child) -> bool { kstd::println("[OS:DEV] Initializing child device {}@{}", child->name(), name()); return child->init() && acc; }); + + m_initialized.test_and_set(); + + return child_status; } auto bus::add_child(kstd::unique_ptr child) -> void -- cgit v1.2.3 From dd8dfa3e674d05927e9ed4b7efcb634a634bfdcc Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 10 Apr 2026 10:30:32 +0200 Subject: kapi: move CPU to kapi --- kernel/kapi/devices/cpu.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 kernel/kapi/devices/cpu.cpp (limited to 'kernel/kapi/devices') diff --git a/kernel/kapi/devices/cpu.cpp b/kernel/kapi/devices/cpu.cpp new file mode 100644 index 0000000..9de5f94 --- /dev/null +++ b/kernel/kapi/devices/cpu.cpp @@ -0,0 +1,31 @@ +#include "kapi/devices/cpu.hpp" + +#include "kapi/devices.hpp" + +#include +#include + +namespace kapi::devices +{ + + cpu::core::core(std::size_t major_number, std::size_t minor_number, std::uint64_t hardware_id, bool is_bsp) + : kapi::devices::bus{major_number, minor_number, "cpu_core"} + , m_hardware_id{hardware_id} + , m_is_bsp{is_bsp} + {} + + auto cpu::core::hardware_id() const -> std::uint64_t + { + return m_hardware_id; + } + + auto cpu::core::is_bsp() const -> bool + { + return m_is_bsp; + } + + cpu::cpu(std::size_t major, std::size_t minor) + : kapi::devices::bus{major, minor, "cpu"} + {} + +} // namespace kapi::devices \ No newline at end of file -- cgit v1.2.3 From 5a6b6ab376e67b173ef36f831445ccba7e86e038 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 10 Apr 2026 10:38:51 +0200 Subject: kapi/devices: add parent back-pointer to device --- kernel/kapi/devices/bus.cpp | 1 + kernel/kapi/devices/device.cpp | 8 ++++++++ 2 files changed, 9 insertions(+) (limited to 'kernel/kapi/devices') diff --git a/kernel/kapi/devices/bus.cpp b/kernel/kapi/devices/bus.cpp index 66b84d2..5f0dfcd 100644 --- a/kernel/kapi/devices/bus.cpp +++ b/kernel/kapi/devices/bus.cpp @@ -45,6 +45,7 @@ namespace kapi::devices auto bus::add_child(kstd::unique_ptr child) -> void { auto observer = m_observers.emplace_back(child.get()); + child->set_parent(kstd::make_observer(this)); m_devices.push_back(std::move(child)); kapi::devices::register_device(*observer); diff --git a/kernel/kapi/devices/device.cpp b/kernel/kapi/devices/device.cpp index 9f7a404..41d96dc 100644 --- a/kernel/kapi/devices/device.cpp +++ b/kernel/kapi/devices/device.cpp @@ -1,5 +1,8 @@ #include "kapi/devices/device.hpp" +#include "kapi/devices/bus.hpp" + +#include #include #include @@ -32,4 +35,9 @@ namespace kapi::devices return false; } + auto device::set_parent(kstd::observer_ptr parent) -> void + { + m_parent = parent; + } + } // namespace kapi::devices \ No newline at end of file -- cgit v1.2.3 From f6f10575f75ac23d06e1d94f7861611503daa7af Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 23 Apr 2026 14:03:28 +0200 Subject: chore: banish relative includes --- kernel/kapi/devices/bus.cpp | 6 +++--- kernel/kapi/devices/cpu.cpp | 4 ++-- kernel/kapi/devices/device.cpp | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) (limited to 'kernel/kapi/devices') diff --git a/kernel/kapi/devices/bus.cpp b/kernel/kapi/devices/bus.cpp index 5f0dfcd..59753f7 100644 --- a/kernel/kapi/devices/bus.cpp +++ b/kernel/kapi/devices/bus.cpp @@ -1,7 +1,7 @@ -#include "kapi/devices/bus.hpp" +#include -#include "kapi/devices.hpp" -#include "kapi/system.hpp" +#include +#include #include #include diff --git a/kernel/kapi/devices/cpu.cpp b/kernel/kapi/devices/cpu.cpp index 9de5f94..f0e1d72 100644 --- a/kernel/kapi/devices/cpu.cpp +++ b/kernel/kapi/devices/cpu.cpp @@ -1,6 +1,6 @@ -#include "kapi/devices/cpu.hpp" +#include -#include "kapi/devices.hpp" +#include #include #include diff --git a/kernel/kapi/devices/device.cpp b/kernel/kapi/devices/device.cpp index 41d96dc..8b5d6b9 100644 --- a/kernel/kapi/devices/device.cpp +++ b/kernel/kapi/devices/device.cpp @@ -1,6 +1,6 @@ -#include "kapi/devices/device.hpp" +#include -#include "kapi/devices/bus.hpp" +#include #include #include -- cgit v1.2.3