diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-04-02 13:36:01 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-04-02 13:36:01 +0200 |
| commit | d0c532af74d8d486d734904fd330d5dae7f49754 (patch) | |
| tree | db85c8ae19b4aba06afcf903aa7edba414c16f6f /kernel/kapi | |
| parent | e7af7ceea2324dcf7d2222986c09d1c478ee4c7e (diff) | |
| download | teachos-d0c532af74d8d486d734904fd330d5dae7f49754.tar.xz teachos-d0c532af74d8d486d734904fd330d5dae7f49754.zip | |
kapi: add basic device subsystem
Diffstat (limited to 'kernel/kapi')
| -rw-r--r-- | kernel/kapi/devices.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/kernel/kapi/devices.cpp b/kernel/kapi/devices.cpp new file mode 100644 index 0000000..dc19ab4 --- /dev/null +++ b/kernel/kapi/devices.cpp @@ -0,0 +1,63 @@ +#include "kapi/devices.hpp" + +#include "kapi/system.hpp" + +#include "kernel/devices/root_bus.hpp" + +#include <kstd/flat_map> +#include <kstd/memory> +#include <kstd/print> + +#include <atomic> +#include <cstddef> +#include <optional> +#include <utility> + +namespace kapi::devices +{ + + namespace + { + auto constinit next_major_number = std::atomic_size_t{0}; + auto constinit root_bus = std::optional<kernel::devices::root_bus>{}; + auto constinit device_tree = kstd::flat_map<std::pair<std::size_t, std::size_t>, kstd::observer_ptr<device>>{}; + } // namespace + + auto init() -> void + { + auto static is_initialized = std::atomic_flag{}; + if (is_initialized.test_and_set()) + { + return; + } + + root_bus.emplace(); + root_bus->init(); + } + + auto get_root_bus() -> bus & + { + if (!root_bus.has_value()) + { + kapi::system::panic("[kernel:devices] Root bus not initialized!"); + } + return *root_bus; + } + + auto allocate_major_number() -> std::size_t + { + return next_major_number++; + } + + auto register_device(device & device) -> bool + { + return device_tree.emplace(std::pair{device.major(), device.minor()}, &device).second; + } + + auto unregister_device(device &) -> bool + { + kstd::println("[kernel:devices] TODO: implement device deregistration"); + return false; + } + +} // namespace kapi::devices
\ No newline at end of file |
