aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-07-30 13:45:18 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-07-30 13:47:47 +0200
commit2b542cb4d5f2302f41d478892694124472cde8b0 (patch)
treef2dee29d6022ae36ab772b0f955561ec565250f9
parent054e336fd82ca204acf52876f99bf45ff0d7babc (diff)
downloadkernel-2b542cb4d5f2302f41d478892694124472cde8b0.tar.xz
kernel-2b542cb4d5f2302f41d478892694124472cde8b0.zip
kernel: add support for character devices
-rw-r--r--kapi/kapi/filesystem/character_special_file.hpp2
-rw-r--r--kernel/kernel/drivers/storage/ram_disk.hpp1
-rw-r--r--kernel/kernel/filesystem/device_inode.cpp19
-rw-r--r--kernel/kernel/filesystem/device_inode.hpp10
-rw-r--r--kernel/kernel/filesystem/file_type_bindings.hpp3
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