From 64bca780a708f592c73ec5993351db9bc6b1b29f Mon Sep 17 00:00:00 2001 From: apio Date: Thu, 30 Mar 2023 21:19:16 +0200 Subject: [PATCH] kernel: Add /dev/zero --- apps/init.cpp | 1 + kernel/CMakeLists.txt | 1 + kernel/src/fs/devices/DeviceRegistry.cpp | 2 ++ kernel/src/fs/devices/ZeroDevice.cpp | 6 +++++ kernel/src/fs/devices/ZeroDevice.h | 28 ++++++++++++++++++++++++ 5 files changed, 38 insertions(+) create mode 100644 kernel/src/fs/devices/ZeroDevice.cpp create mode 100644 kernel/src/fs/devices/ZeroDevice.h diff --git a/apps/init.cpp b/apps/init.cpp index 9e485d40..5062fba1 100644 --- a/apps/init.cpp +++ b/apps/init.cpp @@ -19,6 +19,7 @@ static void populate_devfs() xmknod("/dev/console", 0666, 1, 0); xmknod("/dev/null", 0666, 2, 0); + xmknod("/dev/zero", 0666, 2, 1); } int main() diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 1c929c39..b9708673 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -38,6 +38,7 @@ set(SOURCES src/fs/tmpfs/FileSystem.cpp src/fs/devices/DeviceRegistry.cpp src/fs/devices/NullDevice.cpp + src/fs/devices/ZeroDevice.cpp src/fs/devices/ConsoleDevice.cpp src/InitRD.cpp src/ELF.cpp diff --git a/kernel/src/fs/devices/DeviceRegistry.cpp b/kernel/src/fs/devices/DeviceRegistry.cpp index a4eab963..059376b5 100644 --- a/kernel/src/fs/devices/DeviceRegistry.cpp +++ b/kernel/src/fs/devices/DeviceRegistry.cpp @@ -2,6 +2,7 @@ #include "Log.h" #include "fs/devices/ConsoleDevice.h" #include "fs/devices/NullDevice.h" +#include "fs/devices/ZeroDevice.h" #include struct DeviceDescriptor @@ -42,6 +43,7 @@ namespace DeviceRegistry { // Hardcode default devices. TRY(register_special_device(DeviceMajorTypes::Memory, 0, NullDevice::create)); + TRY(register_special_device(DeviceMajorTypes::Memory, 1, ZeroDevice::create)); TRY(register_special_device(DeviceMajorTypes::Console, 0, ConsoleDevice::create)); return {}; diff --git a/kernel/src/fs/devices/ZeroDevice.cpp b/kernel/src/fs/devices/ZeroDevice.cpp new file mode 100644 index 00000000..f1a4c151 --- /dev/null +++ b/kernel/src/fs/devices/ZeroDevice.cpp @@ -0,0 +1,6 @@ +#include "fs/devices/ZeroDevice.h" + +Result> ZeroDevice::create() +{ + return (SharedPtr)TRY(make_shared()); +} diff --git a/kernel/src/fs/devices/ZeroDevice.h b/kernel/src/fs/devices/ZeroDevice.h new file mode 100644 index 00000000..33da86d8 --- /dev/null +++ b/kernel/src/fs/devices/ZeroDevice.h @@ -0,0 +1,28 @@ +#pragma once +#include "fs/devices/DeviceRegistry.h" + +class ZeroDevice : public Device +{ + public: + // Initializer for DeviceRegistry. + static Result> create(); + + Result read(u8* buf, usize, usize length) const override + { + __builtin_memset(buf, 0, length); + + return length; + } + + Result write(const u8*, usize, usize) override + { + return 0; + } + + bool blocking() const override + { + return false; + } + + virtual ~ZeroDevice() = default; +};