aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/CMakeLists.txt1
-rw-r--r--kernel/include/kernel/test_support/devices/block_device.hpp31
-rw-r--r--kernel/src/test_support/devices/block_device.cpp58
3 files changed, 90 insertions, 0 deletions
diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt
index 85c7661..12683a1 100644
--- a/kernel/CMakeLists.txt
+++ b/kernel/CMakeLists.txt
@@ -101,6 +101,7 @@ else()
"src/test_support/kapi/cio.cpp"
"src/test_support/kapi/interrupts.cpp"
"src/test_support/kapi/memory.cpp"
+ "src/test_support/devices/block_device.cpp"
"src/test_support/log_buffer.cpp"
"src/test_support/output_device.cpp"
"src/test_support/page_mapper.cpp"
diff --git a/kernel/include/kernel/test_support/devices/block_device.hpp b/kernel/include/kernel/test_support/devices/block_device.hpp
new file mode 100644
index 0000000..2327fc4
--- /dev/null
+++ b/kernel/include/kernel/test_support/devices/block_device.hpp
@@ -0,0 +1,31 @@
+#ifndef TEACHOS_KERNEL_TEST_SUPPORT_DEVICES_BLOCK_DEVICE_HPP
+#define TEACHOS_KERNEL_TEST_SUPPORT_DEVICES_BLOCK_DEVICE_HPP
+
+#include "kernel/devices/block_device.hpp"
+
+#include <kstd/string>
+#include <kstd/vector>
+
+#include <cstddef>
+#include <cstdint>
+
+namespace kernel::tests::devices
+{
+
+ struct block_device : kernel::devices::block_device
+ {
+ block_device(size_t major, size_t minor, kstd::string const & name, size_t block_size);
+
+ auto init() -> bool override;
+
+ auto read_block(size_t block_index, void * buffer) const -> void override;
+ auto write_block(size_t block_index, void const * buffer) -> void override;
+
+ [[nodiscard]] auto size() const -> size_t override;
+
+ kstd::vector<uint8_t> data{};
+ };
+
+} // namespace kernel::tests::devices
+
+#endif \ No newline at end of file
diff --git a/kernel/src/test_support/devices/block_device.cpp b/kernel/src/test_support/devices/block_device.cpp
new file mode 100644
index 0000000..bce415f
--- /dev/null
+++ b/kernel/src/test_support/devices/block_device.cpp
@@ -0,0 +1,58 @@
+#include "kernel/test_support/devices/block_device.hpp"
+
+#include "kernel/devices/block_device.hpp"
+
+#include <kstd/string>
+#include <kstd/vector>
+
+#include <algorithm>
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+#include <string.h>
+
+namespace kernel::tests::devices
+{
+ block_device::block_device(size_t major, size_t minor, kstd::string const & name, size_t block_size)
+ : kernel::devices::block_device(major, minor, name, block_size)
+ {}
+
+ auto block_device::init() -> bool
+ {
+ return true;
+ }
+
+ auto block_device::read_block(size_t block_index, void * buffer) const -> void
+ {
+ auto const offset = block_index * block_size();
+ if (offset >= data.size())
+ {
+ kstd::libc::memset(buffer, 0, block_size());
+ return;
+ }
+
+ auto const bytes_to_read = std::min(block_size(), data.size() - offset);
+ kstd::libc::memcpy(buffer, data.data() + offset, bytes_to_read);
+ if (bytes_to_read < block_size())
+ {
+ kstd::libc::memset(static_cast<uint8_t *>(buffer) + bytes_to_read, 0, block_size() - bytes_to_read);
+ }
+ }
+
+ auto block_device::write_block(size_t block_index, void const * buffer) -> void
+ {
+ auto const offset = block_index * block_size();
+ auto const write_end = offset + block_size();
+ if (write_end > data.size())
+ {
+ data.resize(write_end, 0);
+ }
+
+ kstd::libc::memcpy(data.data() + offset, static_cast<uint8_t const *>(buffer), block_size());
+ }
+
+ auto block_device::size() const -> size_t
+ {
+ return data.size();
+ }
+} // namespace kernel::tests::devices \ No newline at end of file