diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-07-26 10:28:44 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-07-26 10:28:44 +0200 |
| commit | ad43e9c9eac69b862789f2e132201cd5ceebaffa (patch) | |
| tree | c73a942e507f646aa952f61da97cedccf7db09dd | |
| parent | 390cac20bfb3040900a5569c4e9dfa1972f8d2bd (diff) | |
| download | kernel-ad43e9c9eac69b862789f2e132201cd5ceebaffa.tar.xz kernel-ad43e9c9eac69b862789f2e132201cd5ceebaffa.zip | |
kapi: move protocol pointer to base bus
| -rw-r--r-- | arch/x86_64/arch/bus/isa.cpp | 12 | ||||
| -rw-r--r-- | arch/x86_64/arch/bus/isa.hpp | 3 | ||||
| -rw-r--r-- | kapi/kapi/devices/bus.hpp | 12 | ||||
| -rw-r--r-- | kapi/kapi/devices/bus_protocol.hpp | 3 | ||||
| -rw-r--r-- | kernel/kapi/devices/bus.cpp | 10 | ||||
| -rw-r--r-- | kernel/kapi/devices/driver.tests.cpp | 28 | ||||
| -rw-r--r-- | kernel/kapi/devices/driver_registry.tests.cpp | 15 | ||||
| -rw-r--r-- | kernel/kernel/bus/boot_modules.cpp | 12 | ||||
| -rw-r--r-- | kernel/kernel/bus/boot_modules.hpp | 2 |
9 files changed, 34 insertions, 63 deletions
diff --git a/arch/x86_64/arch/bus/isa.cpp b/arch/x86_64/arch/bus/isa.cpp index 4df86a6d..11c5f3f5 100644 --- a/arch/x86_64/arch/bus/isa.cpp +++ b/arch/x86_64/arch/bus/isa.cpp @@ -41,17 +41,7 @@ namespace arch::bus } // namespace isa::isa() - : kapi::devices::bus{"isa"} + : kapi::devices::bus{"isa", protocol_instance} {} - auto isa::query_facet(kapi::capabilities::facet_id id) -> void * - { - if (id == kapi::devices::bus_protocol::id) - { - return static_cast<kapi::devices::bus_protocol *>(&protocol_instance); - } - - return bus::query_facet(id); - } - } // namespace arch::bus
\ No newline at end of file diff --git a/arch/x86_64/arch/bus/isa.hpp b/arch/x86_64/arch/bus/isa.hpp index db85f3f7..fe2e83a6 100644 --- a/arch/x86_64/arch/bus/isa.hpp +++ b/arch/x86_64/arch/bus/isa.hpp @@ -42,9 +42,6 @@ namespace arch::bus { //! Construct a default ISA bus. isa(); - - private: - auto query_facet(kapi::capabilities::facet_id id) -> void * override; }; } // namespace arch::bus diff --git a/kapi/kapi/devices/bus.hpp b/kapi/kapi/devices/bus.hpp index 0d679c4e..26b46830 100644 --- a/kapi/kapi/devices/bus.hpp +++ b/kapi/kapi/devices/bus.hpp @@ -4,6 +4,7 @@ // IWYU pragma: private, include <kapi/devices.hpp> #include <kapi/capabilities/facet_id.hpp> +#include <kapi/devices/bus_protocol.hpp> #include <kapi/devices/device.hpp> #include <kstd/memory.hpp> @@ -28,7 +29,13 @@ namespace kapi::devices //! Construct a bus with the given name. //! //! @param name The name of the bus. - explicit bus(kstd::string const & name); + bus(kstd::string const & name); + + //! Construct a bus with the given name and protocol. + //! + //! @param name The name of the bus. + //! @param protocol The bus protocol to use. + bus(kstd::string const & name, bus_protocol & protocol); //! Attach a child device to this bus. //! @@ -47,7 +54,8 @@ namespace kapi::devices auto query_facet(kapi::capabilities::facet_id facet) -> void * override; private: - kstd::vector<kstd::shared_ptr<device>> m_devices; + bus_protocol * m_protocol{}; + kstd::vector<kstd::shared_ptr<device>> m_devices{}; }; //! @} diff --git a/kapi/kapi/devices/bus_protocol.hpp b/kapi/kapi/devices/bus_protocol.hpp index cc1f2e5b..5d63a388 100644 --- a/kapi/kapi/devices/bus_protocol.hpp +++ b/kapi/kapi/devices/bus_protocol.hpp @@ -4,7 +4,6 @@ // IWYU pragma: private, include <kapi/devices.hpp> #include <kapi/capabilities/facet_id.hpp> -#include <kapi/devices/bus.hpp> #include <kapi/devices/device.hpp> #include <kapi/devices/driver.hpp> @@ -15,6 +14,8 @@ namespace kapi::devices { + struct bus; + //! Bus specific behavior. //! //! A bus protocol defines how a bus discovers its attached children, and how drivers are matched against devices. It diff --git a/kernel/kapi/devices/bus.cpp b/kernel/kapi/devices/bus.cpp index 9eecced0..dad90a15 100644 --- a/kernel/kapi/devices/bus.cpp +++ b/kernel/kapi/devices/bus.cpp @@ -1,6 +1,7 @@ #include <kapi/devices/bus.hpp> #include <kapi/devices.hpp> +#include <kapi/devices/bus_protocol.hpp> #include <kapi/devices/driver_registry.hpp> #include <kapi/system.hpp> @@ -17,6 +18,11 @@ namespace kapi::devices : device{name} {} + bus::bus(kstd::string const & name, bus_protocol & protocol) + : device{name} + , m_protocol{&protocol} + {} + auto bus::add_child(kstd::shared_ptr<device> child) -> void { child->set_parent(kstd::static_pointer_cast<bus>(shared_from_this())); @@ -43,6 +49,10 @@ namespace kapi::devices { return this; } + else if (facet == bus_protocol::id) + { + return m_protocol; + } return device::query_facet(facet); } diff --git a/kernel/kapi/devices/driver.tests.cpp b/kernel/kapi/devices/driver.tests.cpp index b935cc57..623f9d4c 100644 --- a/kernel/kapi/devices/driver.tests.cpp +++ b/kernel/kapi/devices/driver.tests.cpp @@ -47,17 +47,9 @@ namespace struct controller_bus final : kapi::devices::bus { - using kapi::devices::bus::bus; - - [[nodiscard]] auto query_facet(kapi::capabilities::facet_id facet) -> void * override - { - if (facet == kapi::devices::bus_protocol::id) - { - return static_cast<kapi::devices::bus_protocol *>(&controller_protocol_instance); - } - - return kapi::devices::bus::query_facet(facet); - } + controller_bus(kstd::string name) + : bus{name, controller_protocol_instance} + {} }; struct controller_device final : kapi::devices::bus, controller_identification @@ -142,17 +134,9 @@ namespace struct leaf_bus final : kapi::devices::bus { - using kapi::devices::bus::bus; - - [[nodiscard]] auto query_facet(kapi::capabilities::facet_id id) -> void * override - { - if (id == kapi::devices::bus_protocol::id) - { - return static_cast<kapi::devices::bus_protocol *>(&leaf_protocol_instance); - } - - return kapi::devices::bus::query_facet(id); - } + leaf_bus(kstd::string name) + : bus{name, leaf_protocol_instance} + {} }; struct controller_driver final : kapi::devices::driver, controller_driver_identification diff --git a/kernel/kapi/devices/driver_registry.tests.cpp b/kernel/kapi/devices/driver_registry.tests.cpp index 7375bd4d..c3889d42 100644 --- a/kernel/kapi/devices/driver_registry.tests.cpp +++ b/kernel/kapi/devices/driver_registry.tests.cpp @@ -4,6 +4,7 @@ #include <kstd/memory.hpp> #include <kstd/result.hpp> +#include <kstd/string.hpp> #include <catch2/catch_test_macros.hpp> @@ -52,17 +53,9 @@ namespace struct test_bus final : kapi::devices::bus { - using kapi::devices::bus::bus; - - [[nodiscard]] auto query_facet(kapi::capabilities::facet_id facet) -> void * override - { - if (facet == kapi::devices::bus_protocol::id) - { - return static_cast<kapi::devices::bus_protocol *>(&bus_protocol); - } - - return kapi::devices::bus::query_facet(facet); - } + test_bus(kstd::string name) + : bus{name, bus_protocol} + {} unsigned match_calls{}; test_protocol bus_protocol{&match_calls}; diff --git a/kernel/kernel/bus/boot_modules.cpp b/kernel/kernel/bus/boot_modules.cpp index 2f5fe8dd..ed7c1e5a 100644 --- a/kernel/kernel/bus/boot_modules.cpp +++ b/kernel/kernel/bus/boot_modules.cpp @@ -60,17 +60,7 @@ namespace kernel::bus } // namespace boot_modules::boot_modules() - : kapi::devices::bus{"boot_modules"} + : kapi::devices::bus{"boot_modules", protocol_instance} {} - auto boot_modules::query_facet(kapi::capabilities::facet_id id) -> void * - { - if (id == kapi::devices::bus_protocol::id) - { - return static_cast<kapi::devices::bus_protocol *>(&protocol_instance); - } - - return kapi::devices::bus::query_facet(id); - } - } // namespace kernel::bus diff --git a/kernel/kernel/bus/boot_modules.hpp b/kernel/kernel/bus/boot_modules.hpp index 011e2b2e..852e5154 100644 --- a/kernel/kernel/bus/boot_modules.hpp +++ b/kernel/kernel/bus/boot_modules.hpp @@ -14,8 +14,6 @@ namespace kernel::bus struct boot_modules final : kapi::devices::bus { boot_modules(); - - [[nodiscard]] auto query_facet(kapi::capabilities::facet_id id) -> void * override; }; } // namespace kernel::bus |
