diff --git a/Kernel/Bus/VirtIO/Console.cpp b/Kernel/Bus/VirtIO/Console.cpp index ab6d3b02ef..6902214ca9 100644 --- a/Kernel/Bus/VirtIO/Console.cpp +++ b/Kernel/Bus/VirtIO/Console.cpp @@ -12,6 +12,11 @@ namespace Kernel::VirtIO { unsigned Console::next_device_id = 0; +UNMAP_AFTER_INIT NonnullRefPtr Console::must_create(PCI::Address address) +{ + return adopt_ref_if_nonnull(new Console(address)).release_nonnull(); +} + UNMAP_AFTER_INIT Console::Console(PCI::Address address) : VirtIO::Device(address) , m_device_id(next_device_id++) diff --git a/Kernel/Bus/VirtIO/Console.h b/Kernel/Bus/VirtIO/Console.h index a9bb01cb50..3a303166ff 100644 --- a/Kernel/Bus/VirtIO/Console.h +++ b/Kernel/Bus/VirtIO/Console.h @@ -18,7 +18,7 @@ class Console friend VirtIO::ConsolePort; public: - Console(PCI::Address); + static NonnullRefPtr must_create(PCI::Address address); virtual ~Console() override = default; virtual StringView purpose() const override { return class_name(); } @@ -30,6 +30,7 @@ public: private: virtual StringView class_name() const override { return "VirtIOConsole"; } + explicit Console(PCI::Address); enum class ControlEvent : u16 { DeviceReady = 0, DeviceAdd = 1, diff --git a/Kernel/Bus/VirtIO/Device.cpp b/Kernel/Bus/VirtIO/Device.cpp index dbf78073bb..320c3e5566 100644 --- a/Kernel/Bus/VirtIO/Device.cpp +++ b/Kernel/Bus/VirtIO/Device.cpp @@ -25,11 +25,11 @@ UNMAP_AFTER_INIT void detect() return; switch (id.device_id) { case PCI::DeviceID::VirtIOConsole: { - [[maybe_unused]] auto& unused = adopt_ref(*new Console(address)).leak_ref(); + [[maybe_unused]] auto& unused = Console::must_create(address).leak_ref(); break; } case PCI::DeviceID::VirtIOEntropy: { - [[maybe_unused]] auto& unused = adopt_ref(*new RNG(address)).leak_ref(); + [[maybe_unused]] auto& unused = RNG::must_create(address).leak_ref(); break; } case PCI::DeviceID::VirtIOGPU: { diff --git a/Kernel/Bus/VirtIO/RNG.cpp b/Kernel/Bus/VirtIO/RNG.cpp index b4db822d9b..5bdaedc449 100644 --- a/Kernel/Bus/VirtIO/RNG.cpp +++ b/Kernel/Bus/VirtIO/RNG.cpp @@ -9,6 +9,11 @@ namespace Kernel::VirtIO { +UNMAP_AFTER_INIT NonnullRefPtr RNG::must_create(PCI::Address address) +{ + return adopt_ref_if_nonnull(new RNG(address)).release_nonnull(); +} + UNMAP_AFTER_INIT RNG::RNG(PCI::Address address) : VirtIO::Device(address) { diff --git a/Kernel/Bus/VirtIO/RNG.h b/Kernel/Bus/VirtIO/RNG.h index ea4e8c775d..bc7947b0e0 100644 --- a/Kernel/Bus/VirtIO/RNG.h +++ b/Kernel/Bus/VirtIO/RNG.h @@ -19,13 +19,13 @@ class RNG final : public RefCounted , public VirtIO::Device { public: + static NonnullRefPtr must_create(PCI::Address address); virtual StringView purpose() const override { return class_name(); } - - RNG(PCI::Address); virtual ~RNG() override; private: virtual StringView class_name() const override { return "VirtIOConsole"; } + explicit RNG(PCI::Address); virtual bool handle_device_config_change() override; virtual void handle_queue_update(u16 queue_index) override; void request_entropy_from_host();