summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2021-09-11 09:19:20 +0300
committerIdan Horowitz <idan.horowitz@gmail.com>2021-09-17 01:02:48 +0300
commitaee4786d8e80a2a4b2b2422afc4f8f342433c599 (patch)
tree1cdedafb91c7f405ff75a53f3c33cacf86d7167b
parent9aa6dd6b786d42f6c131d03cba58e9999e0644d0 (diff)
downloadserenity-aee4786d8e80a2a4b2b2422afc4f8f342433c599.zip
Kernel: Introduce the DeviceManagement singleton
This singleton simplifies many aspects that we struggled with before: 1. There's no need to make derived classes of Device expose the constructor as public anymore. The singleton is a friend of them, so he can call the constructor. This solves the issue with try_create_device helper neatly, hopefully for good. 2. Getting a reference of the NullDevice is now being done from this singleton, which means that NullDevice no longer needs to use its own singleton, and we can apply the try_create_device helper on it too :) 3. We can now defer registration completely after the Device constructor which means the Device constructor is merely assigning the major and minor numbers of the Device, and the try_create_device helper ensures it calls the after_inserting method immediately after construction. This creates a great opportunity to make registration more OOM-safe.
-rw-r--r--Kernel/CMakeLists.txt1
-rw-r--r--Kernel/Devices/Device.cpp45
-rw-r--r--Kernel/Devices/Device.h14
-rw-r--r--Kernel/Devices/DeviceManagement.cpp88
-rw-r--r--Kernel/Devices/DeviceManagement.h54
-rw-r--r--Kernel/Devices/FullDevice.cpp3
-rw-r--r--Kernel/Devices/FullDevice.h5
-rw-r--r--Kernel/Devices/HID/PS2KeyboardDevice.cpp3
-rw-r--r--Kernel/Devices/HID/PS2KeyboardDevice.h5
-rw-r--r--Kernel/Devices/HID/PS2MouseDevice.cpp3
-rw-r--r--Kernel/Devices/HID/PS2MouseDevice.h5
-rw-r--r--Kernel/Devices/HID/VMWareMouseDevice.cpp3
-rw-r--r--Kernel/Devices/HID/VMWareMouseDevice.h3
-rw-r--r--Kernel/Devices/KCOVDevice.cpp3
-rw-r--r--Kernel/Devices/KCOVDevice.h4
-rw-r--r--Kernel/Devices/MemoryDevice.cpp3
-rw-r--r--Kernel/Devices/MemoryDevice.h5
-rw-r--r--Kernel/Devices/NullDevice.cpp16
-rw-r--r--Kernel/Devices/NullDevice.h7
-rw-r--r--Kernel/Devices/RandomDevice.cpp3
-rw-r--r--Kernel/Devices/RandomDevice.h5
-rw-r--r--Kernel/Devices/SerialDevice.cpp9
-rw-r--r--Kernel/Devices/SerialDevice.h5
-rw-r--r--Kernel/Devices/ZeroDevice.cpp3
-rw-r--r--Kernel/Devices/ZeroDevice.h5
-rw-r--r--Kernel/FileSystem/DevPtsFS.cpp3
-rw-r--r--Kernel/FileSystem/DevTmpFS.cpp5
-rw-r--r--Kernel/FileSystem/VirtualFileSystem.cpp3
-rw-r--r--Kernel/GlobalProcessExposed.cpp3
-rw-r--r--Kernel/Graphics/FramebufferDevice.cpp3
-rw-r--r--Kernel/Graphics/FramebufferDevice.h5
-rw-r--r--Kernel/Process.cpp3
-rw-r--r--Kernel/Storage/PATADiskDevice.cpp3
-rw-r--r--Kernel/Storage/PATADiskDevice.h4
-rw-r--r--Kernel/Storage/Partition/DiskPartition.cpp3
-rw-r--r--Kernel/Storage/Partition/DiskPartition.h6
-rw-r--r--Kernel/Storage/RamdiskDevice.cpp3
-rw-r--r--Kernel/Storage/RamdiskDevice.h1
-rw-r--r--Kernel/Storage/SATADiskDevice.cpp3
-rw-r--r--Kernel/Storage/SATADiskDevice.h4
-rw-r--r--Kernel/TTY/VirtualConsole.cpp5
-rw-r--r--Kernel/TTY/VirtualConsole.h5
-rw-r--r--Kernel/init.cpp5
43 files changed, 244 insertions, 123 deletions
diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt
index e819ada537..d2e37b94bb 100644
--- a/Kernel/CMakeLists.txt
+++ b/Kernel/CMakeLists.txt
@@ -48,6 +48,7 @@ set(KERNEL_SOURCES
Devices/BlockDevice.cpp
Devices/CharacterDevice.cpp
Devices/Device.cpp
+ Devices/DeviceManagement.cpp
Devices/FullDevice.cpp
Devices/KCOVDevice.cpp
Devices/KCOVInstance.cpp
diff --git a/Kernel/Devices/Device.cpp b/Kernel/Devices/Device.cpp
index e3b809cb4e..f4301f2bce 100644
--- a/Kernel/Devices/Device.cpp
+++ b/Kernel/Devices/Device.cpp
@@ -6,20 +6,13 @@
#include <AK/Singleton.h>
#include <Kernel/Devices/Device.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/FileSystem/InodeMetadata.h>
#include <Kernel/FileSystem/SysFS.h>
-#include <Kernel/Locking/MutexProtected.h>
#include <Kernel/Sections.h>
namespace Kernel {
-static Singleton<MutexProtected<HashMap<u32, Device*>>> s_all_devices;
-
-MutexProtected<HashMap<u32, Device*>>& Device::all_devices()
-{
- return *s_all_devices;
-}
-
NonnullRefPtr<SysFSDeviceComponent> SysFSDeviceComponent::must_create(Device const& device)
{
return adopt_ref_if_nonnull(new SysFSDeviceComponent(device)).release_nonnull();
@@ -115,41 +108,15 @@ RefPtr<SysFSComponent> SysFSCharacterDevicesDirectory::lookup(StringView name)
});
}
-void Device::for_each(Function<void(Device&)> callback)
-{
- all_devices().with_exclusive([&](auto& map) -> void {
- for (auto& entry : map)
- callback(*entry.value);
- });
-}
-
-Device* Device::get_device(unsigned major, unsigned minor)
-{
- return all_devices().with_exclusive([&](auto& map) -> Device* {
- auto it = map.find(encoded_device(major, minor));
- if (it == map.end())
- return nullptr;
- return it->value;
- });
-}
-
Device::Device(unsigned major, unsigned minor)
: m_major(major)
, m_minor(minor)
{
- u32 device_id = encoded_device(major, minor);
- all_devices().with_exclusive([&](auto& map) -> void {
- auto it = map.find(device_id);
- if (it != map.end()) {
- dbgln("Already registered {},{}: {}", major, minor, it->value->class_name());
- }
- VERIFY(!map.contains(device_id));
- map.set(device_id, this);
- });
}
void Device::after_inserting()
{
+ DeviceManagement::the().after_inserting_device({}, *this);
VERIFY(!m_sysfs_component);
auto sys_fs_component = SysFSDeviceComponent::must_create(*this);
m_sysfs_component = sys_fs_component;
@@ -160,21 +127,17 @@ void Device::after_inserting()
void Device::before_removing()
{
- m_state = State::BeingRemoved;
VERIFY(m_sysfs_component);
SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> void {
list.remove(*m_sysfs_component);
});
+ DeviceManagement::the().before_device_removal({}, *this);
+ m_state = State::BeingRemoved;
}
Device::~Device()
{
VERIFY(m_state == State::BeingRemoved);
- u32 device_id = encoded_device(m_major, m_minor);
- all_devices().with_exclusive([&](auto& map) -> void {
- VERIFY(map.contains(device_id));
- map.remove(encoded_device(m_major, m_minor));
- });
}
String Device::absolute_path() const
diff --git a/Kernel/Devices/Device.h b/Kernel/Devices/Device.h
index e981d76d73..67af4f85e1 100644
--- a/Kernel/Devices/Device.h
+++ b/Kernel/Devices/Device.h
@@ -27,14 +27,6 @@
namespace Kernel {
-template<typename DeviceType, typename... Args>
-inline KResultOr<NonnullRefPtr<DeviceType>> try_create_device(Args&&... args)
-{
- auto device = TRY(adopt_nonnull_ref_or_enomem(new DeviceType(forward<Args>(args)...)));
- device->after_inserting();
- return device;
-}
-
class Device : public File {
protected:
enum class State {
@@ -57,10 +49,6 @@ public:
virtual bool is_device() const override { return true; }
virtual void before_removing() override;
virtual void after_inserting();
-
- static void for_each(Function<void(Device&)>);
- static Device* get_device(unsigned major, unsigned minor);
-
void process_next_queued_request(Badge<AsyncDeviceRequest>, const AsyncDeviceRequest&);
template<typename AsyncRequestType, typename... Args>
@@ -80,8 +68,6 @@ protected:
void set_uid(UserID uid) { m_uid = uid; }
void set_gid(GroupID gid) { m_gid = gid; }
- static MutexProtected<HashMap<u32, Device*>>& all_devices();
-
private:
unsigned m_major { 0 };
unsigned m_minor { 0 };
diff --git a/Kernel/Devices/DeviceManagement.cpp b/Kernel/Devices/DeviceManagement.cpp
new file mode 100644
index 0000000000..b02fc06cbf
--- /dev/null
+++ b/Kernel/Devices/DeviceManagement.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <AK/HashTable.h>
+#include <AK/Singleton.h>
+#include <Kernel/Devices/DeviceManagement.h>
+#include <Kernel/FileSystem/InodeMetadata.h>
+#include <Kernel/Sections.h>
+
+namespace Kernel {
+
+static Singleton<DeviceManagement> s_the;
+
+UNMAP_AFTER_INIT DeviceManagement::DeviceManagement()
+{
+}
+UNMAP_AFTER_INIT void DeviceManagement::initialize()
+{
+ s_the.ensure_instance();
+}
+
+UNMAP_AFTER_INIT void DeviceManagement::attach_null_device(NullDevice const& device)
+{
+ m_null_device = device;
+}
+
+DeviceManagement& DeviceManagement::the()
+{
+ return *s_the;
+}
+
+Device* DeviceManagement::get_device(unsigned major, unsigned minor)
+{
+ return m_devices.with_exclusive([&](auto& map) -> Device* {
+ auto it = map.find(encoded_device(major, minor));
+ if (it == map.end())
+ return nullptr;
+ return it->value;
+ });
+}
+
+void DeviceManagement::before_device_removal(Badge<Device>, Device& device)
+{
+ u32 device_id = encoded_device(device.major(), device.minor());
+ m_devices.with_exclusive([&](auto& map) -> void {
+ VERIFY(map.contains(device_id));
+ map.remove(encoded_device(device.major(), device.minor()));
+ });
+}
+
+void DeviceManagement::after_inserting_device(Badge<Device>, Device& device)
+{
+ u32 device_id = encoded_device(device.major(), device.minor());
+ m_devices.with_exclusive([&](auto& map) -> void {
+ if (map.contains(device_id)) {
+ dbgln("Already registered {},{}: {}", device.major(), device.minor(), device.class_name());
+ VERIFY_NOT_REACHED();
+ }
+ auto result = map.set(device_id, &device);
+ if (result != AK::HashSetResult::InsertedNewEntry) {
+ dbgln("Failed to register {},{}: {}", device.major(), device.minor(), device.class_name());
+ VERIFY_NOT_REACHED();
+ }
+ });
+}
+
+void DeviceManagement::for_each(Function<void(Device&)> callback)
+{
+ m_devices.with_exclusive([&](auto& map) -> void {
+ for (auto& entry : map)
+ callback(*entry.value);
+ });
+}
+
+NullDevice& DeviceManagement::null_device()
+{
+ return *m_null_device;
+}
+
+NullDevice const& DeviceManagement::null_device() const
+{
+ return *m_null_device;
+}
+
+}
diff --git a/Kernel/Devices/DeviceManagement.h b/Kernel/Devices/DeviceManagement.h
new file mode 100644
index 0000000000..4ec1720e11
--- /dev/null
+++ b/Kernel/Devices/DeviceManagement.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/Badge.h>
+#include <AK/NonnullRefPtrVector.h>
+#include <AK/OwnPtr.h>
+#include <AK/RefPtr.h>
+#include <AK/Time.h>
+#include <AK/Types.h>
+#include <Kernel/API/KResult.h>
+#include <Kernel/API/TimePage.h>
+#include <Kernel/Arch/x86/RegisterState.h>
+#include <Kernel/Devices/Device.h>
+#include <Kernel/Devices/NullDevice.h>
+#include <Kernel/UnixTypes.h>
+
+namespace Kernel {
+
+class DeviceManagement {
+ AK_MAKE_ETERNAL;
+
+public:
+ DeviceManagement();
+ static void initialize();
+ static DeviceManagement& the();
+ void attach_null_device(NullDevice const&);
+
+ void after_inserting_device(Badge<Device>, Device&);
+ void before_device_removal(Badge<Device>, Device&);
+
+ void for_each(Function<void(Device&)>);
+ Device* get_device(unsigned major, unsigned minor);
+ NullDevice const& null_device() const;
+ NullDevice& null_device();
+
+ template<typename DeviceType, typename... Args>
+ static inline KResultOr<NonnullRefPtr<DeviceType>> try_create_device(Args&&... args)
+ {
+ auto device = TRY(adopt_nonnull_ref_or_enomem(new DeviceType(forward<Args>(args)...)));
+ device->after_inserting();
+ return device;
+ }
+
+private:
+ RefPtr<NullDevice> m_null_device;
+ MutexProtected<HashMap<u32, Device*>> m_devices;
+};
+
+}
diff --git a/Kernel/Devices/FullDevice.cpp b/Kernel/Devices/FullDevice.cpp
index df425cfcea..48f0288b38 100644
--- a/Kernel/Devices/FullDevice.cpp
+++ b/Kernel/Devices/FullDevice.cpp
@@ -5,6 +5,7 @@
*/
#include <AK/Memory.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/FullDevice.h>
#include <Kernel/Sections.h>
#include <LibC/errno_numbers.h>
@@ -13,7 +14,7 @@ namespace Kernel {
UNMAP_AFTER_INIT NonnullRefPtr<FullDevice> FullDevice::must_create()
{
- auto full_device_or_error = try_create_device<FullDevice>();
+ auto full_device_or_error = DeviceManagement::try_create_device<FullDevice>();
// FIXME: Find a way to propagate errors
VERIFY(!full_device_or_error.is_error());
return full_device_or_error.release_value();
diff --git a/Kernel/Devices/FullDevice.h b/Kernel/Devices/FullDevice.h
index 3a3f7e09b9..2336e48cff 100644
--- a/Kernel/Devices/FullDevice.h
+++ b/Kernel/Devices/FullDevice.h
@@ -12,14 +12,15 @@ namespace Kernel {
class FullDevice final : public CharacterDevice {
AK_MAKE_ETERNAL
+ friend class DeviceManagement;
+
public:
static NonnullRefPtr<FullDevice> must_create();
virtual ~FullDevice() override;
- // FIXME: We expose this constructor to make try_create_device helper to work
+private:
FullDevice();
-private:
// ^CharacterDevice
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
diff --git a/Kernel/Devices/HID/PS2KeyboardDevice.cpp b/Kernel/Devices/HID/PS2KeyboardDevice.cpp
index 0b569b632f..1f024a3303 100644
--- a/Kernel/Devices/HID/PS2KeyboardDevice.cpp
+++ b/Kernel/Devices/HID/PS2KeyboardDevice.cpp
@@ -9,6 +9,7 @@
#include <AK/Singleton.h>
#include <AK/Types.h>
#include <Kernel/Debug.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/HID/HIDManagement.h>
#include <Kernel/Devices/HID/PS2KeyboardDevice.h>
#include <Kernel/IO.h>
@@ -83,7 +84,7 @@ bool PS2KeyboardDevice::handle_irq(const RegisterState&)
UNMAP_AFTER_INIT RefPtr<PS2KeyboardDevice> PS2KeyboardDevice::try_to_initialize(const I8042Controller& ps2_controller)
{
- auto keyboard_device_or_error = try_create_device<PS2KeyboardDevice>(ps2_controller);
+ auto keyboard_device_or_error = DeviceManagement::try_create_device<PS2KeyboardDevice>(ps2_controller);
// FIXME: Find a way to propagate errors
VERIFY(!keyboard_device_or_error.is_error());
if (keyboard_device_or_error.value()->initialize())
diff --git a/Kernel/Devices/HID/PS2KeyboardDevice.h b/Kernel/Devices/HID/PS2KeyboardDevice.h
index cd8feca328..39f440a0a9 100644
--- a/Kernel/Devices/HID/PS2KeyboardDevice.h
+++ b/Kernel/Devices/HID/PS2KeyboardDevice.h
@@ -21,6 +21,8 @@ namespace Kernel {
class PS2KeyboardDevice final : public IRQHandler
, public KeyboardDevice
, public I8042Device {
+ friend class DeviceManagement;
+
public:
static RefPtr<PS2KeyboardDevice> try_to_initialize(const I8042Controller&);
virtual ~PS2KeyboardDevice() override;
@@ -35,10 +37,9 @@ public:
enable_irq();
}
- // FIXME: We expose this constructor to make try_create_device helper to work
+private:
explicit PS2KeyboardDevice(const I8042Controller&);
-private:
// ^IRQHandler
virtual bool handle_irq(const RegisterState&) override;
diff --git a/Kernel/Devices/HID/PS2MouseDevice.cpp b/Kernel/Devices/HID/PS2MouseDevice.cpp
index fce0609e2c..f04a4b1758 100644
--- a/Kernel/Devices/HID/PS2MouseDevice.cpp
+++ b/Kernel/Devices/HID/PS2MouseDevice.cpp
@@ -6,6 +6,7 @@
#include <AK/Memory.h>
#include <Kernel/Debug.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/HID/PS2MouseDevice.h>
#include <Kernel/Devices/VMWareBackdoor.h>
#include <Kernel/IO.h>
@@ -174,7 +175,7 @@ void PS2MouseDevice::set_sample_rate(u8 rate)
UNMAP_AFTER_INIT RefPtr<PS2MouseDevice> PS2MouseDevice::try_to_initialize(const I8042Controller& ps2_controller)
{
- auto mouse_device_or_error = try_create_device<PS2MouseDevice>(ps2_controller);
+ auto mouse_device_or_error = DeviceManagement::try_create_device<PS2MouseDevice>(ps2_controller);
// FIXME: Find a way to propagate errors
VERIFY(!mouse_device_or_error.is_error());
if (mouse_device_or_error.value()->initialize())
diff --git a/Kernel/Devices/HID/PS2MouseDevice.h b/Kernel/Devices/HID/PS2MouseDevice.h
index fc3b84cd00..b232bf2d1f 100644
--- a/Kernel/Devices/HID/PS2MouseDevice.h
+++ b/Kernel/Devices/HID/PS2MouseDevice.h
@@ -17,6 +17,8 @@ namespace Kernel {
class PS2MouseDevice : public IRQHandler
, public MouseDevice
, public I8042Device {
+ friend class DeviceManagement;
+
public:
static RefPtr<PS2MouseDevice> try_to_initialize(const I8042Controller&);
bool initialize();
@@ -32,10 +34,9 @@ public:
enable_irq();
}
- // FIXME: We expose this constructor to make try_create_device helper to work
+protected:
explicit PS2MouseDevice(const I8042Controller&);
-protected:
// ^IRQHandler
virtual bool handle_irq(const RegisterState&) override;
diff --git a/Kernel/Devices/HID/VMWareMouseDevice.cpp b/Kernel/Devices/HID/VMWareMouseDevice.cpp
index 291cde6a78..f2a6908153 100644
--- a/Kernel/Devices/HID/VMWareMouseDevice.cpp
+++ b/Kernel/Devices/HID/VMWareMouseDevice.cpp
@@ -4,6 +4,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/HID/VMWareMouseDevice.h>
#include <Kernel/Devices/VMWareBackdoor.h>
#include <Kernel/Sections.h>
@@ -16,7 +17,7 @@ UNMAP_AFTER_INIT RefPtr<VMWareMouseDevice> VMWareMouseDevice::try_to_initialize(
return {};
if (!VMWareBackdoor::the()->vmmouse_is_absolute())
return {};
- auto mouse_device_or_error = try_create_device<VMWareMouseDevice>(ps2_controller);
+ auto mouse_device_or_error = DeviceManagement::try_create_device<VMWareMouseDevice>(ps2_controller);
// FIXME: Find a way to propagate errors
VERIFY(!mouse_device_or_error.is_error());
if (mouse_device_or_error.value()->initialize())
diff --git a/Kernel/Devices/HID/VMWareMouseDevice.h b/Kernel/Devices/HID/VMWareMouseDevice.h
index 7f17e27392..3968099990 100644
--- a/Kernel/Devices/HID/VMWareMouseDevice.h
+++ b/Kernel/Devices/HID/VMWareMouseDevice.h
@@ -17,13 +17,14 @@ namespace Kernel {
class VMWareMouseDevice final : public PS2MouseDevice {
public:
+ friend class DeviceManagement;
static RefPtr<VMWareMouseDevice> try_to_initialize(const I8042Controller&);
virtual ~VMWareMouseDevice() override;
// ^I8042Device
virtual void irq_handle_byte_read(u8 byte) override;
- // FIXME: We expose this constructor to make try_create_device helper to work
+private:
explicit VMWareMouseDevice(const I8042Controller&);
};
diff --git a/Kernel/Devices/KCOVDevice.cpp b/Kernel/Devices/KCOVDevice.cpp
index 0d3dc59674..8534e8cbb1 100644
--- a/Kernel/Devices/KCOVDevice.cpp
+++ b/Kernel/Devices/KCOVDevice.cpp
@@ -6,6 +6,7 @@
#include <AK/Assertions.h>
#include <AK/NonnullOwnPtr.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/KCOVDevice.h>
#include <Kernel/Devices/KCOVInstance.h>
#include <Kernel/FileSystem/OpenFileDescription.h>
@@ -20,7 +21,7 @@ HashMap<ThreadID, KCOVInstance*>* KCOVDevice::thread_instance;
UNMAP_AFTER_INIT NonnullRefPtr<KCOVDevice> KCOVDevice::must_create()
{
- auto kcov_device_or_error = try_create_device<KCOVDevice>();
+ auto kcov_device_or_error = DeviceManagement::try_create_device<KCOVDevice>();
// FIXME: Find a way to propagate errors
VERIFY(!kcov_device_or_error.is_error());
return kcov_device_or_error.release_value();
diff --git a/Kernel/Devices/KCOVDevice.h b/Kernel/Devices/KCOVDevice.h
index 0b7fcc8799..576577dff5 100644
--- a/Kernel/Devices/KCOVDevice.h
+++ b/Kernel/Devices/KCOVDevice.h
@@ -12,6 +12,7 @@
namespace Kernel {
class KCOVDevice final : public BlockDevice {
AK_MAKE_ETERNAL
+ friend class DeviceManagement;
public:
static HashMap<ProcessID, KCOVInstance*>* proc_instance;
@@ -25,10 +26,9 @@ public:
KResultOr<Memory::Region*> mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
KResultOr<NonnullRefPtr<OpenFileDescription>> open(int options) override;
- // FIXME: We expose this constructor to make try_create_device helper to work
+protected:
KCOVDevice();
-protected:
virtual StringView class_name() const override { return "KCOVDevice"; }
virtual bool can_read(const OpenFileDescription&, size_t) const override final { return true; }
diff --git a/Kernel/Devices/MemoryDevice.cpp b/Kernel/Devices/MemoryDevice.cpp
index 1bdb1b9b58..3a0d42ad7e 100644
--- a/Kernel/Devices/MemoryDevice.cpp
+++ b/Kernel/Devices/MemoryDevice.cpp
@@ -6,6 +6,7 @@
#include <AK/Memory.h>
#include <AK/StdLibExtras.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/MemoryDevice.h>
#include <Kernel/Firmware/BIOS.h>
#include <Kernel/Memory/AnonymousVMObject.h>
@@ -15,7 +16,7 @@ namespace Kernel {
UNMAP_AFTER_INIT NonnullRefPtr<MemoryDevice> MemoryDevice::must_create()
{
- auto memory_device_or_error = try_create_device<MemoryDevice>();
+ auto memory_device_or_error = DeviceManagement::try_create_device<MemoryDevice>();
// FIXME: Find a way to propagate errors
VERIFY(!memory_device_or_error.is_error());
return memory_device_or_error.release_value();
diff --git a/Kernel/Devices/MemoryDevice.h b/Kernel/Devices/MemoryDevice.h
index 0f40d26a4f..016ab6c556 100644
--- a/Kernel/Devices/MemoryDevice.h
+++ b/Kernel/Devices/MemoryDevice.h
@@ -15,16 +15,17 @@ namespace Kernel {
class MemoryDevice final : public CharacterDevice {
AK_MAKE_ETERNAL
+ friend class DeviceManagement;
+
public:
static NonnullRefPtr<MemoryDevice> must_create();
~MemoryDevice();
virtual KResultOr<Memory::Region*> mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
- // FIXME: We expose this constructor to make try_create_device helper to work
+private:
MemoryDevice();
-private:
virtual StringView class_name() const override { return "MemoryDevice"; }
virtual bool can_read(const OpenFileDescription&, size_t) const override { return true; }
virtual bool can_write(const OpenFileDescription&, size_t) const override { return false; }
diff --git a/Kernel/Devices/NullDevice.cpp b/Kernel/Devices/NullDevice.cpp
index ae20bcfeba..29d27f6922 100644
--- a/Kernel/Devices/NullDevice.cpp
+++ b/Kernel/Devices/NullDevice.cpp
@@ -5,22 +5,18 @@
*/
#include <AK/Singleton.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/NullDevice.h>
#include <Kernel/Sections.h>
namespace Kernel {
-static Singleton<NullDevice> s_the;
-
-UNMAP_AFTER_INIT void NullDevice::initialize()
-{
- s_the.ensure_instance();
- s_the->after_inserting();
-}
-
-NullDevice& NullDevice::the()
+UNMAP_AFTER_INIT NonnullRefPtr<NullDevice> NullDevice::must_initialize()
{
- return *s_the;
+ auto null_device_or_error = DeviceManagement::try_create_device<NullDevice>();
+ // FIXME: Find a way to propagate errors
+ VERIFY(!null_device_or_error.is_error());
+ return null_device_or_error.release_value();
}
UNMAP_AFTER_INIT NullDevice::NullDevice()
diff --git a/Kernel/Devices/NullDevice.h b/Kernel/Devices/NullDevice.h
index d10729c44c..7078bac39d 100644
--- a/Kernel/Devices/NullDevice.h
+++ b/Kernel/Devices/NullDevice.h
@@ -12,14 +12,15 @@ namespace Kernel {
class NullDevice final : public CharacterDevice {
AK_MAKE_ETERNAL
+ friend class DeviceManagement;
+
public:
- NullDevice();
virtual ~NullDevice() override;
- static void initialize();
- static NullDevice& the();
+ static NonnullRefPtr<NullDevice> must_initialize();
private:
+ NullDevice();
// ^CharacterDevice
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
diff --git a/Kernel/Devices/RandomDevice.cpp b/Kernel/Devices/RandomDevice.cpp
index 1d2ab995e4..cc66978366 100644
--- a/Kernel/Devices/RandomDevice.cpp
+++ b/Kernel/Devices/RandomDevice.cpp
@@ -4,6 +4,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/RandomDevice.h>
#include <Kernel/Random.h>
#include <Kernel/Sections.h>
@@ -12,7 +13,7 @@ namespace Kernel {
UNMAP_AFTER_INIT NonnullRefPtr<RandomDevice> RandomDevice::must_create()
{
- auto random_device_or_error = try_create_device<RandomDevice>();
+ auto random_device_or_error = DeviceManagement::try_create_device<RandomDevice>();
// FIXME: Find a way to propagate errors
VERIFY(!random_device_or_error.is_error());
return random_device_or_error.release_value();
diff --git a/Kernel/Devices/RandomDevice.h b/Kernel/Devices/RandomDevice.h
index 8e915cd1c5..06337479c9 100644
--- a/Kernel/Devices/RandomDevice.h
+++ b/Kernel/Devices/RandomDevice.h
@@ -12,14 +12,15 @@ namespace Kernel {
class RandomDevice final : public CharacterDevice {
AK_MAKE_ETERNAL
+ friend class DeviceManagement;
+
public:
static NonnullRefPtr<RandomDevice> must_create();
virtual ~RandomDevice() override;
- // FIXME: We expose this constructor to make try_create_device helper to work
+private:
RandomDevice();
-private:
// ^CharacterDevice
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
diff --git a/Kernel/Devices/SerialDevice.cpp b/Kernel/Devices/SerialDevice.cpp
index 81416502f1..8e881325f6 100644
--- a/Kernel/Devices/SerialDevice.cpp
+++ b/Kernel/Devices/SerialDevice.cpp
@@ -5,6 +5,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/SerialDevice.h>
#include <Kernel/IO.h>
#include <Kernel/Sections.h>
@@ -23,19 +24,19 @@ UNMAP_AFTER_INIT NonnullRefPtr<SerialDevice> SerialDevice::must_create(size_t co
RefPtr<SerialDevice> serial_device;
switch (com_number) {
case 0: {
- serial_device = try_create_device<SerialDevice>(IOAddress(SERIAL_COM1_ADDR), 64).release_value();
+ serial_device = DeviceManagement::try_create_device<SerialDevice>(IOAddress(SERIAL_COM1_ADDR), 64).release_value();
break;
}
case 1: {
- serial_device = try_create_device<SerialDevice>(IOAddress(SERIAL_COM2_ADDR), 65).release_value();
+ serial_device = DeviceManagement::try_create_device<SerialDevice>(IOAddress(SERIAL_COM2_ADDR), 65).release_value();
break;
}
case 2: {
- serial_device = try_create_device<SerialDevice>(IOAddress(SERIAL_COM3_ADDR), 66).release_value();
+ serial_device = DeviceManagement::try_create_device<SerialDevice>(IOAddress(SERIAL_COM3_ADDR), 66).release_value();
break;
}
case 3: {
- serial_device = try_create_device<SerialDevice>(IOAddress(SERIAL_COM4_ADDR), 67).release_value();
+ serial_device = DeviceManagement::try_create_device<SerialDevice>(IOAddress(SERIAL_COM4_ADDR), 67).release_value();
break;
}
default:
diff --git a/Kernel/Devices/SerialDevice.h b/Kernel/Devices/SerialDevice.h
index ac6c158720..d92f3e591e 100644
--- a/Kernel/Devices/SerialDevice.h
+++ b/Kernel/Devices/SerialDevice.h
@@ -13,6 +13,8 @@ namespace Kernel {
class SerialDevice final : public CharacterDevice {
AK_MAKE_ETERNAL
+ friend class DeviceManagement;
+
public:
static NonnullRefPtr<SerialDevice> must_create(size_t com_number);
@@ -102,10 +104,9 @@ public:
DataReady = 0x01 << 0
};
- // FIXME: We expose this constructor to make try_create_device helper to work
+private:
SerialDevice(IOAddress base_addr, unsigned minor);
-private:
friend class PCISerialDevice;
// ^CharacterDevice
diff --git a/Kernel/Devices/ZeroDevice.cpp b/Kernel/Devices/ZeroDevice.cpp
index fad3113f1a..ed10d1ef39 100644
--- a/Kernel/Devices/ZeroDevice.cpp
+++ b/Kernel/Devices/ZeroDevice.cpp
@@ -5,6 +5,7 @@
*/
#include <AK/Memory.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/ZeroDevice.h>
#include <Kernel/Sections.h>
@@ -12,7 +13,7 @@ namespace Kernel {
UNMAP_AFTER_INIT NonnullRefPtr<ZeroDevice> ZeroDevice::must_create()
{
- auto zero_device_or_error = try_create_device<ZeroDevice>();
+ auto zero_device_or_error = DeviceManagement::try_create_device<ZeroDevice>();
// FIXME: Find a way to propagate errors
VERIFY(!zero_device_or_error.is_error());
return zero_device_or_error.release_value();
diff --git a/Kernel/Devices/ZeroDevice.h b/Kernel/Devices/ZeroDevice.h
index e5a2b6dea2..63d02f1500 100644
--- a/Kernel/Devices/ZeroDevice.h
+++ b/Kernel/Devices/ZeroDevice.h
@@ -12,14 +12,15 @@ namespace Kernel {
class ZeroDevice final : public CharacterDevice {
AK_MAKE_ETERNAL
+ friend class DeviceManagement;
+
public:
static NonnullRefPtr<ZeroDevice> must_create();
virtual ~ZeroDevice() override;
- // FIXME: We expose this constructor to make try_create_device helper to work
+private:
ZeroDevice();
-private:
// ^CharacterDevice
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
diff --git a/Kernel/FileSystem/DevPtsFS.cpp b/Kernel/FileSystem/DevPtsFS.cpp
index 9543c26ff2..4c64ef1958 100644
--- a/Kernel/FileSystem/DevPtsFS.cpp
+++ b/Kernel/FileSystem/DevPtsFS.cpp
@@ -5,6 +5,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/FileSystem/DevPtsFS.h>
#include <Kernel/FileSystem/VirtualFileSystem.h>
#include <Kernel/TTY/SlavePTY.h>
@@ -58,7 +59,7 @@ KResultOr<NonnullRefPtr<Inode>> DevPtsFS::get_inode(InodeIdentifier inode_id) co
return *m_root_inode;
unsigned pty_index = inode_index_to_pty_index(inode_id.index());
- auto* device = Device::get_device(201, pty_index);
+ auto* device = DeviceManagement::the().get_device(201, pty_index);
VERIFY(device);
auto inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevPtsFSInode(const_cast<DevPtsFS&>(*this), inode_id.index(), static_cast<SlavePTY*>(device))));
diff --git a/Kernel/FileSystem/DevTmpFS.cpp b/Kernel/FileSystem/DevTmpFS.cpp
index 5921b8209b..93df86d516 100644
--- a/Kernel/FileSystem/DevTmpFS.cpp
+++ b/Kernel/FileSystem/DevTmpFS.cpp
@@ -5,6 +5,7 @@
*/
#include <AK/StringView.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/FileSystem/DevTmpFS.h>
#include <Kernel/FileSystem/VirtualFileSystem.h>
@@ -321,7 +322,7 @@ KResultOr<size_t> DevTmpFSDeviceInode::read_bytes(off_t offset, size_t count, Us
{
MutexLocker locker(m_inode_lock);
VERIFY(!!description);
- RefPtr<Device> device = Device::get_device(m_major_number, m_minor_number);
+ RefPtr<Device> device = DeviceManagement::the().get_device(m_major_number, m_minor_number);
if (!device)
return KResult(ENODEV);
if (!device->can_read(*description, offset))
@@ -336,7 +337,7 @@ KResultOr<size_t> DevTmpFSDeviceInode::write_bytes(off_t offset, size_t count, c
{
MutexLocker locker(m_inode_lock);
VERIFY(!!description);
- RefPtr<Device> device = Device::get_device(m_major_number, m_minor_number);
+ RefPtr<Device> device = DeviceManagement::the().get_device(m_major_number, m_minor_number);
if (!device)
return KResult(ENODEV);
if (!device->can_write(*description, offset))
diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp
index 5378a58a2d..886c4cf7d3 100644
--- a/Kernel/FileSystem/VirtualFileSystem.cpp
+++ b/Kernel/FileSystem/VirtualFileSystem.cpp
@@ -9,6 +9,7 @@
#include <AK/StringBuilder.h>
#include <Kernel/Debug.h>
#include <Kernel/Devices/BlockDevice.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/FileSystem/Custody.h>
#include <Kernel/FileSystem/FileBackedFileSystem.h>
#include <Kernel/FileSystem/FileSystem.h>
@@ -270,7 +271,7 @@ KResultOr<NonnullRefPtr<OpenFileDescription>> VirtualFileSystem::open(StringView
if (metadata.is_device()) {
if (custody.mount_flags() & MS_NODEV)
return EACCES;
- auto device = Device::get_device(metadata.major_device, metadata.minor_device);
+ auto device = DeviceManagement::the().get_device(metadata.major_device, metadata.minor_device);
if (device == nullptr) {
return ENODEV;
}
diff --git a/Kernel/GlobalProcessExposed.cpp b/Kernel/GlobalProcessExposed.cpp
index bad352eef3..3b6f567d11 100644
--- a/Kernel/GlobalProcessExposed.cpp
+++ b/Kernel/GlobalProcessExposed.cpp
@@ -12,6 +12,7 @@
#include <Kernel/Bus/PCI/API.h>
#include <Kernel/CommandLine.h>
#include <Kernel/ConsoleDevice.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/HID/HIDManagement.h>
#include <Kernel/FileSystem/Custody.h>
#include <Kernel/FileSystem/FileBackedFileSystem.h>
@@ -640,7 +641,7 @@ private:
virtual KResult try_generate(KBufferBuilder& builder) override
{
JsonArraySerializer array { builder };
- Device::for_each([&array](auto& device) {
+ DeviceManagement::the().for_each([&array](auto& device) {
auto obj = array.add_object();
obj.add("major", device.major());
obj.add("minor", device.minor());
diff --git a/Kernel/Graphics/FramebufferDevice.cpp b/Kernel/Graphics/FramebufferDevice.cpp
index 0d36a3400e..07afd0b4b0 100644
--- a/Kernel/Graphics/FramebufferDevice.cpp
+++ b/Kernel/Graphics/FramebufferDevice.cpp
@@ -6,6 +6,7 @@
#include <AK/Checked.h>
#include <Kernel/Debug.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Graphics/FramebufferDevice.h>
#include <Kernel/Graphics/GraphicsManagement.h>
#include <Kernel/Memory/AnonymousVMObject.h>
@@ -22,7 +23,7 @@ namespace Kernel {
NonnullRefPtr<FramebufferDevice> FramebufferDevice::create(const GraphicsDevice& adapter, size_t output_port_index, PhysicalAddress paddr, size_t width, size_t height, size_t pitch)
{
- auto framebuffer_device_or_error = try_create_device<FramebufferDevice>(adapter, output_port_index, paddr, width, height, pitch);
+ auto framebuffer_device_or_error = DeviceManagement::try_create_device<FramebufferDevice>(adapter, output_port_index, paddr, width, height, pitch);
// FIXME: Find a way to propagate errors
VERIFY(!framebuffer_device_or_error.is_error());
return framebuffer_device_or_error.release_value();
diff --git a/Kernel/Graphics/FramebufferDevice.h b/Kernel/Graphics/FramebufferDevice.h
index 2b4e958bbf..531ea005fb 100644
--- a/Kernel/Graphics/FramebufferDevice.h
+++ b/Kernel/Graphics/FramebufferDevice.h
@@ -19,6 +19,8 @@ namespace Kernel {
class FramebufferDevice : public BlockDevice {
AK_MAKE_ETERNAL
+ friend class DeviceManagement;
+
public:
static NonnullRefPtr<FramebufferDevice> create(const GraphicsDevice&, size_t, PhysicalAddress, size_t, size_t, size_t);
@@ -32,10 +34,9 @@ public:
virtual ~FramebufferDevice() {};
KResult initialize();
- // FIXME: We expose this constructor to make try_create_device helper to work
+private:
FramebufferDevice(const GraphicsDevice&, size_t, PhysicalAddress, size_t, size_t, size_t);
-private:
// ^File
virtual StringView class_name() const override { return "FramebufferDevice"; }
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp
index 3d58a58278..aed6523c6a 100644
--- a/Kernel/Process.cpp
+++ b/Kernel/Process.cpp
@@ -13,6 +13,7 @@
#include <Kernel/Arch/x86/InterruptDisabler.h>
#include <Kernel/Coredump.h>
#include <Kernel/Debug.h>
+#include <Kernel/Devices/DeviceManagement.h>
#ifdef ENABLE_KERNEL_COVERAGE_COLLECTION
# include <Kernel/Devices/KCOVDevice.h>
#endif
@@ -156,7 +157,7 @@ KResultOr<NonnullRefPtr<Process>> Process::try_create_user_process(RefPtr<Thread
first_thread = nullptr;
return ENOMEM;
}
- auto& device_to_use_as_tty = tty ? (CharacterDevice&)*tty : NullDevice::the();
+ auto& device_to_use_as_tty = tty ? (CharacterDevice&)*tty : DeviceManagement::the().null_device();
auto description = TRY(device_to_use_as_tty.open(O_RDWR));
auto setup_description = [&process, &description](int fd) {
process->m_fds.m_fds_metadatas[fd].allocate();
diff --git a/Kernel/Storage/PATADiskDevice.cpp b/Kernel/Storage/PATADiskDevice.cpp
index d4aab035b0..11a594f1bb 100644
--- a/Kernel/Storage/PATADiskDevice.cpp
+++ b/Kernel/Storage/PATADiskDevice.cpp
@@ -5,6 +5,7 @@
*/
#include <AK/StringView.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/FileSystem/OpenFileDescription.h>
#include <Kernel/Sections.h>
#include <Kernel/Storage/IDEChannel.h>
@@ -15,7 +16,7 @@ namespace Kernel {
UNMAP_AFTER_INIT NonnullRefPtr<PATADiskDevice> PATADiskDevice::create(const IDEController& controller, IDEChannel& channel, DriveType type, InterfaceType interface_type, u16 capabilities, u64 max_addressable_block)
{
- auto device_or_error = try_create_device<PATADiskDevice>(controller, channel, type, interface_type, capabilities, max_addressable_block);
+ auto device_or_error = DeviceManagement::try_create_device<PATADiskDevice>(controller, channel, type, interface_type, capabilities, max_addressable_block);
// FIXME: Find a way to propagate errors
VERIFY(!device_or_error.is_error());
return device_or_error.release_value();
diff --git a/Kernel/Storage/PATADiskDevice.h b/Kernel/Storage/PATADiskDevice.h
index 9de2561b36..77fc49b77a 100644
--- a/Kernel/Storage/PATADiskDevice.h
+++ b/Kernel/Storage/PATADiskDevice.h
@@ -20,6 +20,7 @@ class IDEController;
class IDEChannel;
class PATADiskDevice final : public StorageDevice {
friend class IDEController;
+ friend class DeviceManagement;
AK_MAKE_ETERNAL
public:
// Type of drive this IDEDiskDevice is on the ATA channel.
@@ -44,10 +45,9 @@ public:
virtual void start_request(AsyncBlockDeviceRequest&) override;
virtual String storage_name() const override;
- // FIXME: We expose this constructor to make try_create_device helper to work
+private:
PATADiskDevice(const IDEController&, IDEChannel&, DriveType, InterfaceType, u16, u64);
-private:
// ^DiskDevice
virtual StringView class_name() const override;
diff --git a/Kernel/Storage/Partition/DiskPartition.cpp b/Kernel/Storage/Partition/DiskPartition.cpp
index 5352528773..d1941a16de 100644
--- a/Kernel/Storage/Partition/DiskPartition.cpp
+++ b/Kernel/Storage/Partition/DiskPartition.cpp
@@ -5,6 +5,7 @@
*/
#include <Kernel/Debug.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/FileSystem/OpenFileDescription.h>
#include <Kernel/Storage/Partition/DiskPartition.h>
@@ -12,7 +13,7 @@ namespace Kernel {
NonnullRefPtr<DiskPartition> DiskPartition::create(BlockDevice& device, unsigned minor_number, DiskPartitionMetadata metadata)
{
- auto partition_or_error = try_create_device<DiskPartition>(device, minor_number, metadata);
+ auto partition_or_error = DeviceManagement::try_create_device<DiskPartition>(device, minor_number, metadata);
// FIXME: Find a way to propagate errors
VERIFY(!partition_or_error.is_error());
return partition_or_error.release_value();
diff --git a/Kernel/Storage/Partition/DiskPartition.h b/Kernel/Storage/Partition/DiskPartition.h
index 1d4bae1c75..4c172785be 100644
--- a/Kernel/Storage/Partition/DiskPartition.h
+++ b/Kernel/Storage/Partition/DiskPartition.h
@@ -14,6 +14,8 @@
namespace Kernel {
class DiskPartition final : public BlockDevice {
+ friend class DeviceManagement;
+
public:
static NonnullRefPtr<DiskPartition> create(BlockDevice&, unsigned, DiskPartitionMetadata);
virtual ~DiskPartition();
@@ -28,10 +30,8 @@ public:
const DiskPartitionMetadata& metadata() const;
- // FIXME: We expose this constructor to make try_create_device helper to work
- DiskPartition(BlockDevice&, unsigned, DiskPartitionMetadata);
-
private:
+ DiskPartition(BlockDevice&, unsigned, DiskPartitionMetadata);
virtual StringView class_name() const override;
WeakPtr<BlockDevice> m_device;
diff --git a/Kernel/Storage/RamdiskDevice.cpp b/Kernel/Storage/RamdiskDevice.cpp
index 5d831edae2..e08ecdbf87 100644
--- a/Kernel/Storage/RamdiskDevice.cpp
+++ b/Kernel/Storage/RamdiskDevice.cpp
@@ -6,6 +6,7 @@
#include <AK/Memory.h>
#include <AK/StringView.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/FileSystem/OpenFileDescription.h>
#include <Kernel/Storage/RamdiskController.h>
#include <Kernel/Storage/RamdiskDevice.h>
@@ -14,7 +15,7 @@ namespace Kernel {
NonnullRefPtr<RamdiskDevice> RamdiskDevice::create(const RamdiskController& controller, NonnullOwnPtr<Memory::Region>&& region, int major, int minor)
{
- auto device_or_error = try_create_device<RamdiskDevice>(controller, move(region), major, minor);
+ auto device_or_error = DeviceManagement::try_create_device<RamdiskDevice>(controller, move(region), major, minor);
// FIXME: Find a way to propagate errors
VERIFY(!device_or_error.is_error());
return device_or_error.release_value();
diff --git a/Kernel/Storage/RamdiskDevice.h b/Kernel/Storage/RamdiskDevice.h
index a55c3fd026..91cf4a22cf 100644
--- a/Kernel/Storage/RamdiskDevice.h
+++ b/Kernel/Storage/RamdiskDevice.h
@@ -15,6 +15,7 @@ class RamdiskController;
class RamdiskDevice final : public StorageDevice {
friend class RamdiskController;
+ friend class DeviceManagement;
AK_MAKE_ETERNAL
public:
static NonnullRefPtr<RamdiskDevice> create(const RamdiskController&, NonnullOwnPtr<Memory::Region>&& region, int major, int minor);
diff --git a/Kernel/Storage/SATADiskDevice.cpp b/Kernel/Storage/SATADiskDevice.cpp
index 0e7c7bd8d4..7563f0cb31 100644
--- a/Kernel/Storage/SATADiskDevice.cpp
+++ b/Kernel/Storage/SATADiskDevice.cpp
@@ -5,6 +5,7 @@
*/
#include <AK/StringView.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/FileSystem/OpenFileDescription.h>
#include <Kernel/Storage/AHCIController.h>
#include <Kernel/Storage/IDEChannel.h>
@@ -14,7 +15,7 @@ namespace Kernel {
NonnullRefPtr<SATADiskDevice> SATADiskDevice::create(const AHCIController& controller, const AHCIPort& port, size_t sector_size, u64 max_addressable_block)
{
- auto device_or_error = try_create_device<SATADiskDevice>(controller, port, sector_size, max_addressable_block);
+ auto device_or_error = DeviceManagement::try_create_device<SATADiskDevice>(controller, port, sector_size, max_addressable_block);
// FIXME: Find a way to propagate errors
VERIFY(!device_or_error.is_error());
return device_or_error.release_value();
diff --git a/Kernel/Storage/SATADiskDevice.h b/Kernel/Storage/SATADiskDevice.h
index 97776b4500..76f6d21fb9 100644
--- a/Kernel/Storage/SATADiskDevice.h
+++ b/Kernel/Storage/SATADiskDevice.h
@@ -16,6 +16,7 @@ namespace Kernel {
class AHCIController;
class SATADiskDevice final : public StorageDevice {
friend class AHCIController;
+ friend class DeviceManagement;
public:
enum class InterfaceType : u8 {
@@ -32,10 +33,9 @@ public:
virtual void start_request(AsyncBlockDeviceRequest&) override;
virtual String storage_name() const override;
- // FIXME: We expose this constructor to make try_create_device helper to work
+private:
SATADiskDevice(const AHCIController&, const AHCIPort&, size_t sector_size, u64 max_addressable_block);
-private:
// ^DiskDevice
virtual StringView class_name() const override;
WeakPtr<AHCIPort> m_port;
diff --git a/Kernel/TTY/VirtualConsole.cpp b/Kernel/TTY/VirtualConsole.cpp
index 58361a3a79..9cf1cc4ce4 100644
--- a/Kernel/TTY/VirtualConsole.cpp
+++ b/Kernel/TTY/VirtualConsole.cpp
@@ -9,6 +9,7 @@
#include <AK/StdLibExtras.h>
#include <AK/String.h>
#include <Kernel/Debug.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/HID/HIDManagement.h>
#include <Kernel/Graphics/GraphicsManagement.h>
#include <Kernel/Heap/kmalloc.h>
@@ -103,7 +104,7 @@ void VirtualConsole::set_graphical(bool graphical)
UNMAP_AFTER_INIT NonnullRefPtr<VirtualConsole> VirtualConsole::create(size_t index)
{
- auto virtual_console_or_error = try_create_device<VirtualConsole>(index);
+ auto virtual_console_or_error = DeviceManagement::try_create_device<VirtualConsole>(index);
// FIXME: Find a way to propagate errors
VERIFY(!virtual_console_or_error.is_error());
return virtual_console_or_error.release_value();
@@ -111,7 +112,7 @@ UNMAP_AFTER_INIT NonnullRefPtr<VirtualConsole> VirtualConsole::create(size_t ind
UNMAP_AFTER_INIT NonnullRefPtr<VirtualConsole> VirtualConsole::create_with_preset_log(size_t index, const CircularQueue<char, 16384>& log)
{
- auto virtual_console_or_error = try_create_device<VirtualConsole>(index, log);
+ auto virtual_console_or_error = DeviceManagement::try_create_device<VirtualConsole>(index, log);
// FIXME: Find a way to propagate errors
VERIFY(!virtual_console_or_error.is_error());
return virtual_console_or_error.release_value();
diff --git a/Kernel/TTY/VirtualConsole.h b/Kernel/TTY/VirtualConsole.h
index d90e718cbe..fd0047cdcd 100644
--- a/Kernel/TTY/VirtualConsole.h
+++ b/Kernel/TTY/VirtualConsole.h
@@ -50,6 +50,7 @@ class VirtualConsole final : public TTY
, public VT::TerminalClient {
AK_MAKE_ETERNAL
friend class ConsoleManagement;
+ friend class DeviceManagement;
friend class ConsoleImpl;
friend class VT::Terminal;
@@ -84,11 +85,9 @@ public:
void emit_char(char);
- // FIXME: We expose these constructors to make try_create_device helper to work
+private:
explicit VirtualConsole(const unsigned index);
VirtualConsole(const unsigned index, const CircularQueue<char, 16384>&);
-
-private:
// ^KeyboardClient
virtual void on_key_pressed(KeyEvent) override;
diff --git a/Kernel/init.cpp b/Kernel/init.cpp
index 854b18a4b0..516eea7d0b 100644
--- a/Kernel/init.cpp
+++ b/Kernel/init.cpp
@@ -13,6 +13,7 @@
#include <Kernel/Bus/VirtIO/Device.h>
#include <Kernel/CMOS.h>
#include <Kernel/CommandLine.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/FullDevice.h>
#include <Kernel/Devices/HID/HIDManagement.h>
#include <Kernel/Devices/KCOVDevice.h>
@@ -182,7 +183,10 @@ extern "C" [[noreturn]] UNMAP_AFTER_INIT void init(BootInfo const& boot_info)
load_kernel_symbol_table();
+ DeviceManagement::initialize();
SysFSComponentRegistry::initialize();
+ DeviceManagement::the().attach_null_device(*NullDevice::must_initialize());
+
ConsoleDevice::initialize();
s_bsp_processor.initialize(0);
@@ -281,7 +285,6 @@ void init_stage2(void*)
VirtualFileSystem::initialize();
- NullDevice::initialize();
if (!get_serial_debug())
(void)SerialDevice::must_create(0).leak_ref();
(void)SerialDevice::must_create(1).leak_ref();