diff --git a/kernel/include/kernel/DeviceManager.h b/kernel/include/kernel/DeviceManager.h index f02920259..d3cc34c75 100644 --- a/kernel/include/kernel/DeviceManager.h +++ b/kernel/include/kernel/DeviceManager.h @@ -17,9 +17,11 @@ namespace Kernel BAN_NON_MOVABLE(DeviceManager); public: - static void initialize(); static DeviceManager& get(); + void initialize_pci_devices(); + void initialize_updater(); + ino_t get_next_ino() const; dev_t get_next_rdev() const; uint8_t get_next_input_dev() const; diff --git a/kernel/include/kernel/Terminal/TTY.h b/kernel/include/kernel/Terminal/TTY.h index 6674b7ec4..d14a3a15c 100644 --- a/kernel/include/kernel/Terminal/TTY.h +++ b/kernel/include/kernel/Terminal/TTY.h @@ -28,6 +28,8 @@ namespace Kernel static bool is_initialized(); static TTY* current(); + void initialize_device(); + virtual BAN::ErrorOr read(size_t, void*, size_t) override; virtual BAN::ErrorOr write(size_t, const void*, size_t) override; @@ -110,8 +112,8 @@ namespace Kernel virtual BAN::StringView name() const { return m_name; } private: - const dev_t m_rdev; - const BAN::String m_name; + dev_t m_rdev; + BAN::String m_name; }; } diff --git a/kernel/kernel/DeviceManager.cpp b/kernel/kernel/DeviceManager.cpp index 00a67dbcc..8ac851f81 100644 --- a/kernel/kernel/DeviceManager.cpp +++ b/kernel/kernel/DeviceManager.cpp @@ -7,15 +7,14 @@ namespace Kernel { - static DeviceManager* s_instance = nullptr; - - void DeviceManager::initialize() + DeviceManager& DeviceManager::get() { - ASSERT(s_instance == nullptr); + static DeviceManager instance; + return instance; + } - s_instance = new DeviceManager; - ASSERT(s_instance != nullptr); - + void DeviceManager::initialize_pci_devices() + { for (const auto& pci_device : PCI::get().devices()) { switch (pci_device.class_code()) @@ -38,16 +37,16 @@ namespace Kernel if (controller) { - s_instance->add_device(controller); + add_device(controller); for (auto* device : controller->devices()) { - s_instance->add_device(device); + add_device(device); if (auto res = device->initialize_partitions(); res.is_error()) dprintln("{}", res.error()); else { for (auto* partition : device->partitions()) - s_instance->add_device(partition); + add_device(partition); } } } @@ -57,7 +56,10 @@ namespace Kernel break; } } + } + void DeviceManager::initialize_updater() + { MUST(Process::create_kernel( [](void*) { @@ -70,12 +72,6 @@ namespace Kernel ); } - DeviceManager& DeviceManager::get() - { - ASSERT(s_instance); - return *s_instance; - } - ino_t DeviceManager::get_next_ino() const { static ino_t next_ino = 1; diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index 9f0987165..caa61d436 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -33,8 +33,6 @@ namespace Kernel TTY::TTY(TerminalDriver* driver) : m_terminal_driver(driver) - , m_rdev(next_tty_rdev()) - , m_name(BAN::String::formatted("tty{}", minor(m_rdev))) { m_width = m_terminal_driver->width(); m_height = m_terminal_driver->height(); @@ -44,7 +42,19 @@ namespace Kernel if (s_tty == nullptr) s_tty = this; - + } + + TTY* TTY::current() + { + return s_tty; + } + + void TTY::initialize_device() + { + m_rdev = next_tty_rdev(); + m_name = BAN::String::formatted("tty{}", minor(m_rdev)); + DeviceManager::get().add_device(this); + MUST(Process::create_kernel( [](void* tty_) { @@ -60,11 +70,6 @@ namespace Kernel ); } - TTY* TTY::current() - { - return s_tty; - } - void TTY::on_key(Input::KeyEvent event) { LockGuard _(m_lock); diff --git a/kernel/kernel/kernel.cpp b/kernel/kernel/kernel.cpp index 36b0e6704..dedca7996 100644 --- a/kernel/kernel/kernel.cpp +++ b/kernel/kernel/kernel.cpp @@ -137,6 +137,13 @@ extern "C" void kernel_main() MMU::intialize(); dprintln("MMU initialized"); + TerminalDriver* terminal_driver = VesaTerminalDriver::create(); + ASSERT(terminal_driver); + dprintln("VESA initialized"); + + TTY* tty1 = new TTY(terminal_driver); + ASSERT(tty1); + Memory::Heap::initialize(); dprintln("Heap initialzed"); @@ -146,10 +153,6 @@ extern "C" void kernel_main() PCI::initialize(); dprintln("PCI initialized"); - TerminalDriver* terminal_driver = VesaTerminalDriver::create(); - ASSERT(terminal_driver); - dprintln("VESA initialized"); - MUST(ACPI::initialize()); dprintln("ACPI initialized"); @@ -161,27 +164,26 @@ extern "C" void kernel_main() MUST(Scheduler::initialize()); Scheduler& scheduler = Scheduler::get(); - MUST(scheduler.add_thread(MUST(Thread::create(init2, terminal_driver)))); + MUST(scheduler.add_thread(MUST(Thread::create(init2, tty1)))); scheduler.start(); ASSERT_NOT_REACHED(); } -static void init2(void* terminal_driver) +static void init2(void* tty1) { using namespace Kernel; using namespace Kernel::Input; - DeviceManager::initialize(); + DeviceManager::get().initialize_pci_devices(); + DeviceManager::get().initialize_updater(); MUST(VirtualFileSystem::initialize(cmdline.root)); if (auto res = PS2Controller::initialize(); res.is_error()) dprintln("{}", res.error()); - TTY* tty1 = new TTY((TerminalDriver*)terminal_driver); - ASSERT(tty1); - DeviceManager::get().add_device(tty1); + ((TTY*)tty1)->initialize_device(); MUST(Process::create_kernel( [](void*)