diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-07-30 13:45:18 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-07-30 13:47:47 +0200 |
| commit | 2b542cb4d5f2302f41d478892694124472cde8b0 (patch) | |
| tree | f2dee29d6022ae36ab772b0f955561ec565250f9 | |
| parent | 054e336fd82ca204acf52876f99bf45ff0d7babc (diff) | |
| download | kernel-2b542cb4d5f2302f41d478892694124472cde8b0.tar.xz kernel-2b542cb4d5f2302f41d478892694124472cde8b0.zip | |
kernel: add support for character devices
| -rw-r--r-- | kapi/kapi/filesystem/character_special_file.hpp | 2 | ||||
| -rw-r--r-- | kernel/kernel/drivers/storage/ram_disk.hpp | 1 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/device_inode.cpp | 19 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/device_inode.hpp | 10 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/file_type_bindings.hpp | 3 |
5 files changed, 30 insertions, 5 deletions
diff --git a/kapi/kapi/filesystem/character_special_file.hpp b/kapi/kapi/filesystem/character_special_file.hpp index 328bbef9..28bba0b9 100644 --- a/kapi/kapi/filesystem/character_special_file.hpp +++ b/kapi/kapi/filesystem/character_special_file.hpp @@ -31,7 +31,7 @@ namespace kapi::filesystem //! //! @param buffer The buffer to write from. //! @return The number of bytes written on success, an error otherwise. - auto virtual write_block(std::span<std::byte const> buffer) -> kstd::result<kstd::units::bytes> = 0; + auto virtual write(std::span<std::byte const> buffer) -> kstd::result<kstd::units::bytes> = 0; }; } // namespace kapi::filesystem diff --git a/kernel/kernel/drivers/storage/ram_disk.hpp b/kernel/kernel/drivers/storage/ram_disk.hpp index d5d54551..45c5bbc2 100644 --- a/kernel/kernel/drivers/storage/ram_disk.hpp +++ b/kernel/kernel/drivers/storage/ram_disk.hpp @@ -2,6 +2,7 @@ #define TEACH_OS_KERNEL_DRIVERS_STORAGE_RAM_DISK_HPP #include <kapi/boot_modules.hpp> +#include <kapi/capabilities/facet_id.hpp> #include <kapi/devices.hpp> #include <kstd/result.hpp> diff --git a/kernel/kernel/filesystem/device_inode.cpp b/kernel/kernel/filesystem/device_inode.cpp index 4696504e..d6f7637a 100644 --- a/kernel/kernel/filesystem/device_inode.cpp +++ b/kernel/kernel/filesystem/device_inode.cpp @@ -14,7 +14,9 @@ #include <kstd/result.hpp> #include <kstd/units.hpp> +#include <cstddef> #include <optional> +#include <span> namespace kernel::filesystem { @@ -51,6 +53,11 @@ namespace kernel::filesystem { return devices::block_device_utils::read(*block_device, buffer, offset, size); } + else if (auto character_device = + kapi::devices::facet_registry::get().resolve<kapi::filesystem::character_special_file>(*m_device)) + { + return character_device->read(std::span{static_cast<std::byte *>(buffer), size.value}); + } return kstd::failure(vfs_errc::no_such_device); } @@ -68,6 +75,11 @@ namespace kernel::filesystem { return devices::block_device_utils::write(*block_device, buffer, offset, size); } + else if (auto character_device = + kapi::devices::facet_registry::get().resolve<kapi::filesystem::character_special_file>(*m_device)) + { + return character_device->write(std::span{static_cast<std::byte const *>(buffer), size.value}); + } return kstd::failure(vfs_errc::no_such_device); } @@ -79,7 +91,12 @@ namespace kernel::filesystem auto device_inode::is_block_device() const -> bool { - return true; + return kapi::devices::facet_registry::get().resolve<kapi::filesystem::block_special_file>(*m_device); + } + + auto device_inode::is_character_device() const -> bool + { + return kapi::devices::facet_registry::get().resolve<kapi::filesystem::character_special_file>(*m_device); } auto device_inode::status() const -> kstd::result<kapi::filesystem::file_status> diff --git a/kernel/kernel/filesystem/device_inode.hpp b/kernel/kernel/filesystem/device_inode.hpp index e2167131..17ebe236 100644 --- a/kernel/kernel/filesystem/device_inode.hpp +++ b/kernel/kernel/filesystem/device_inode.hpp @@ -61,11 +61,17 @@ namespace kernel::filesystem [[nodiscard]] auto device() const -> kstd::shared_ptr<kapi::devices::device> const &; /** - @brief Check if this inode represents a device. - @return returns true, since this inode is a device inode and represents a device. + @brief Check if this inode represents a block device. + @return true iff. the underlying device is a block device, false otherwise. */ [[nodiscard]] auto is_block_device() const -> bool override; + /** + @brief Check if this inode represents a character device. + @return true iff. the underlying device is a character device, false otherwise. + */ + [[nodiscard]] auto is_character_device() const -> bool override; + [[nodiscard]] auto status() const -> kstd::result<kapi::filesystem::file_status> override; [[nodiscard]] auto raw_device() const -> std::optional<kapi::filesystem::device_number> override; diff --git a/kernel/kernel/filesystem/file_type_bindings.hpp b/kernel/kernel/filesystem/file_type_bindings.hpp index ea52972b..b4338024 100644 --- a/kernel/kernel/filesystem/file_type_bindings.hpp +++ b/kernel/kernel/filesystem/file_type_bindings.hpp @@ -22,7 +22,8 @@ namespace kernel::filesystem //! //! This array associates published facets with files types. constexpr auto inline file_type_bindings = std::array{ - file_type_binding{kapi::filesystem::block_special_file::id, file_type::block}, + file_type_binding{kapi::filesystem::character_special_file::id, file_type::character}, + file_type_binding{ kapi::filesystem::block_special_file::id, file_type::block}, }; } // namespace kernel::filesystem |
