summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Kernel/Devices/ConsoleDevice.cpp20
-rw-r--r--Kernel/Devices/ConsoleDevice.h8
-rw-r--r--Kernel/Devices/DeviceManagement.cpp15
-rw-r--r--Kernel/Devices/DeviceManagement.h9
-rw-r--r--Kernel/GlobalProcessExposed.cpp3
-rw-r--r--Kernel/TTY/ConsoleManagement.cpp4
-rw-r--r--Kernel/init.cpp3
-rw-r--r--Kernel/kprintf.cpp5
8 files changed, 42 insertions, 25 deletions
diff --git a/Kernel/Devices/ConsoleDevice.cpp b/Kernel/Devices/ConsoleDevice.cpp
index d782848f0e..000919db7f 100644
--- a/Kernel/Devices/ConsoleDevice.cpp
+++ b/Kernel/Devices/ConsoleDevice.cpp
@@ -4,8 +4,8 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
-#include <AK/Singleton.h>
#include <Kernel/Devices/ConsoleDevice.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/IO.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Sections.h>
@@ -14,23 +14,13 @@
// Output bytes to kernel debug port 0xE9 (Bochs console). It's very handy.
#define CONSOLE_OUT_TO_BOCHS_DEBUG_PORT
-static Singleton<ConsoleDevice> s_the;
static Kernel::Spinlock g_console_lock;
-UNMAP_AFTER_INIT void ConsoleDevice::initialize()
+UNMAP_AFTER_INIT NonnullRefPtr<ConsoleDevice> ConsoleDevice::must_create()
{
- s_the.ensure_instance();
- s_the->after_inserting();
-}
-
-ConsoleDevice& ConsoleDevice::the()
-{
- return *s_the;
-}
-
-bool ConsoleDevice::is_initialized()
-{
- return s_the.is_initialized();
+ auto device_or_error = DeviceManagement::try_create_device<ConsoleDevice>();
+ VERIFY(!device_or_error.is_error());
+ return device_or_error.release_value();
}
UNMAP_AFTER_INIT ConsoleDevice::ConsoleDevice()
diff --git a/Kernel/Devices/ConsoleDevice.h b/Kernel/Devices/ConsoleDevice.h
index 9bcd5f1160..95b5538ec6 100644
--- a/Kernel/Devices/ConsoleDevice.h
+++ b/Kernel/Devices/ConsoleDevice.h
@@ -14,12 +14,11 @@ namespace Kernel {
class ConsoleDevice final : public CharacterDevice {
AK_MAKE_ETERNAL
+ friend class DeviceManagement;
+
public:
- static ConsoleDevice& the();
- static void initialize();
- static bool is_initialized();
+ static NonnullRefPtr<ConsoleDevice> must_create();
- ConsoleDevice();
virtual ~ConsoleDevice() override;
// ^CharacterDevice
@@ -34,6 +33,7 @@ public:
const CircularQueue<char, 16384>& logbuffer() const { return m_logbuffer; }
private:
+ ConsoleDevice();
CircularQueue<char, 16384> m_logbuffer;
};
diff --git a/Kernel/Devices/DeviceManagement.cpp b/Kernel/Devices/DeviceManagement.cpp
index b02fc06cbf..41d8d73e21 100644
--- a/Kernel/Devices/DeviceManagement.cpp
+++ b/Kernel/Devices/DeviceManagement.cpp
@@ -22,6 +22,12 @@ UNMAP_AFTER_INIT void DeviceManagement::initialize()
s_the.ensure_instance();
}
+
+UNMAP_AFTER_INIT void DeviceManagement::attach_console_device(ConsoleDevice const& device)
+{
+ m_console_device = device;
+}
+
UNMAP_AFTER_INIT void DeviceManagement::attach_null_device(NullDevice const& device)
{
m_null_device = device;
@@ -85,4 +91,13 @@ NullDevice const& DeviceManagement::null_device() const
return *m_null_device;
}
+ConsoleDevice const& DeviceManagement::console_device() const
+{
+ return *m_console_device;
+}
+ConsoleDevice& DeviceManagement::console_device()
+{
+ return *m_console_device;
+}
+
}
diff --git a/Kernel/Devices/DeviceManagement.h b/Kernel/Devices/DeviceManagement.h
index 4ec1720e11..1cb4553a0d 100644
--- a/Kernel/Devices/DeviceManagement.h
+++ b/Kernel/Devices/DeviceManagement.h
@@ -15,6 +15,7 @@
#include <Kernel/API/KResult.h>
#include <Kernel/API/TimePage.h>
#include <Kernel/Arch/x86/RegisterState.h>
+#include <Kernel/Devices/ConsoleDevice.h>
#include <Kernel/Devices/Device.h>
#include <Kernel/Devices/NullDevice.h>
#include <Kernel/UnixTypes.h>
@@ -30,14 +31,21 @@ public:
static DeviceManagement& the();
void attach_null_device(NullDevice const&);
+ bool is_console_device_attached() const { return !m_console_device.is_null(); }
+ void attach_console_device(ConsoleDevice 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();
+ ConsoleDevice const& console_device() const;
+ ConsoleDevice& console_device();
+
template<typename DeviceType, typename... Args>
static inline KResultOr<NonnullRefPtr<DeviceType>> try_create_device(Args&&... args)
{
@@ -48,6 +56,7 @@ public:
private:
RefPtr<NullDevice> m_null_device;
+ RefPtr<ConsoleDevice> m_console_device;
MutexProtected<HashMap<u32, Device*>> m_devices;
};
diff --git a/Kernel/GlobalProcessExposed.cpp b/Kernel/GlobalProcessExposed.cpp
index 0cbd3538a6..5ee5930bf9 100644
--- a/Kernel/GlobalProcessExposed.cpp
+++ b/Kernel/GlobalProcessExposed.cpp
@@ -559,8 +559,9 @@ private:
ProcFSDmesg();
virtual KResult try_generate(KBufferBuilder& builder) override
{
+ VERIFY(DeviceManagement::the().is_console_device_attached());
InterruptDisabler disabler;
- for (char ch : ConsoleDevice::the().logbuffer()) {
+ for (char ch : DeviceManagement::the().console_device().logbuffer()) {
TRY(builder.append(ch));
}
return KSuccess;
diff --git a/Kernel/TTY/ConsoleManagement.cpp b/Kernel/TTY/ConsoleManagement.cpp
index 038fba66d4..690e0b14b1 100644
--- a/Kernel/TTY/ConsoleManagement.cpp
+++ b/Kernel/TTY/ConsoleManagement.cpp
@@ -7,6 +7,7 @@
#include <AK/Singleton.h>
#include <Kernel/CommandLine.h>
#include <Kernel/Debug.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Graphics/GraphicsManagement.h>
#include <Kernel/Panic.h>
#include <Kernel/Sections.h>
@@ -48,7 +49,8 @@ UNMAP_AFTER_INIT void ConsoleManagement::initialize()
for (size_t index = 0; index < s_max_virtual_consoles; index++) {
// FIXME: Better determine the debug TTY we chose...
if (index == 1) {
- m_consoles.append(VirtualConsole::create_with_preset_log(index, ConsoleDevice::the().logbuffer()));
+ VERIFY(DeviceManagement::the().is_console_device_attached());
+ m_consoles.append(VirtualConsole::create_with_preset_log(index, DeviceManagement::the().console_device().logbuffer()));
continue;
}
m_consoles.append(VirtualConsole::create(index));
diff --git a/Kernel/init.cpp b/Kernel/init.cpp
index 516eea7d0b..9961547af8 100644
--- a/Kernel/init.cpp
+++ b/Kernel/init.cpp
@@ -186,8 +186,7 @@ extern "C" [[noreturn]] UNMAP_AFTER_INIT void init(BootInfo const& boot_info)
DeviceManagement::initialize();
SysFSComponentRegistry::initialize();
DeviceManagement::the().attach_null_device(*NullDevice::must_initialize());
-
- ConsoleDevice::initialize();
+ DeviceManagement::the().attach_console_device(*ConsoleDevice::must_create());
s_bsp_processor.initialize(0);
CommandLine::initialize();
diff --git a/Kernel/kprintf.cpp b/Kernel/kprintf.cpp
index 4d3583d9a6..6aa0529139 100644
--- a/Kernel/kprintf.cpp
+++ b/Kernel/kprintf.cpp
@@ -8,6 +8,7 @@
#include <AK/StringView.h>
#include <AK/Types.h>
#include <Kernel/Devices/ConsoleDevice.h>
+#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/PCISerialDevice.h>
#include <Kernel/Graphics/GraphicsManagement.h>
#include <Kernel/IO.h>
@@ -87,8 +88,8 @@ static void console_out(char ch)
// It would be bad to reach the assert in ConsoleDevice()::the() and do a stack overflow
- if (ConsoleDevice::is_initialized()) {
- ConsoleDevice::the().put_char(ch);
+ if (DeviceManagement::the().is_console_device_attached()) {
+ DeviceManagement::the().console_device().put_char(ch);
} else {
IO::out8(IO::BOCHS_DEBUG_PORT, ch);
}