aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-07-26 10:28:44 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-07-26 10:28:44 +0200
commitad43e9c9eac69b862789f2e132201cd5ceebaffa (patch)
treec73a942e507f646aa952f61da97cedccf7db09dd
parent390cac20bfb3040900a5569c4e9dfa1972f8d2bd (diff)
downloadkernel-ad43e9c9eac69b862789f2e132201cd5ceebaffa.tar.xz
kernel-ad43e9c9eac69b862789f2e132201cd5ceebaffa.zip
kapi: move protocol pointer to base bus
-rw-r--r--arch/x86_64/arch/bus/isa.cpp12
-rw-r--r--arch/x86_64/arch/bus/isa.hpp3
-rw-r--r--kapi/kapi/devices/bus.hpp12
-rw-r--r--kapi/kapi/devices/bus_protocol.hpp3
-rw-r--r--kernel/kapi/devices/bus.cpp10
-rw-r--r--kernel/kapi/devices/driver.tests.cpp28
-rw-r--r--kernel/kapi/devices/driver_registry.tests.cpp15
-rw-r--r--kernel/kernel/bus/boot_modules.cpp12
-rw-r--r--kernel/kernel/bus/boot_modules.hpp2
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