From ac4583660b2c7da33ac13b4733f993767bb08644 Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Wed, 26 Jan 2022 22:03:48 +0200 Subject: [PATCH] Kernel: Make VirtIO::ConsolePort construction OOM-fallible --- Kernel/Bus/VirtIO/ConsolePort.cpp | 13 ++++++++++--- Kernel/Bus/VirtIO/ConsolePort.h | 9 ++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Kernel/Bus/VirtIO/ConsolePort.cpp b/Kernel/Bus/VirtIO/ConsolePort.cpp index c484879da9..b13729d8ec 100644 --- a/Kernel/Bus/VirtIO/ConsolePort.cpp +++ b/Kernel/Bus/VirtIO/ConsolePort.cpp @@ -12,13 +12,20 @@ namespace Kernel::VirtIO { unsigned ConsolePort::next_device_id = 0; -ConsolePort::ConsolePort(unsigned port, VirtIO::Console& console) +ErrorOr> ConsolePort::try_create(unsigned port, Console& console) +{ + auto receive_buffer = TRY(Memory::RingBuffer::try_create("VirtIO::ConsolePort Receive"sv, RINGBUFFER_SIZE)); + auto transmit_buffer = TRY(Memory::RingBuffer::try_create("VirtIO::ConsolePort Transmit"sv, RINGBUFFER_SIZE)); + return adopt_nonnull_ref_or_enomem(new (nothrow) ConsolePort(port, console, move(receive_buffer), move(transmit_buffer))); +} + +ConsolePort::ConsolePort(unsigned port, VirtIO::Console& console, NonnullOwnPtr receive_buffer, NonnullOwnPtr transmit_buffer) : CharacterDevice(229, next_device_id++) + , m_receive_buffer(move(receive_buffer)) + , m_transmit_buffer(move(transmit_buffer)) , m_console(console) , m_port(port) { - m_receive_buffer = Memory::RingBuffer::try_create("VirtIO::ConsolePort Receive"sv, RINGBUFFER_SIZE).release_value_but_fixme_should_propagate_errors(); - m_transmit_buffer = Memory::RingBuffer::try_create("VirtIO::ConsolePort Transmit"sv, RINGBUFFER_SIZE).release_value_but_fixme_should_propagate_errors(); m_receive_queue = m_port == 0 ? 0 : m_port * 2 + 2; m_transmit_queue = m_port == 0 ? 1 : m_port * 2 + 3; } diff --git a/Kernel/Bus/VirtIO/ConsolePort.h b/Kernel/Bus/VirtIO/ConsolePort.h index 40797ab397..beed06e1a2 100644 --- a/Kernel/Bus/VirtIO/ConsolePort.h +++ b/Kernel/Bus/VirtIO/ConsolePort.h @@ -24,7 +24,8 @@ class Console; class ConsolePort : public CharacterDevice { public: - explicit ConsolePort(unsigned port, VirtIO::Console&); + static ErrorOr> try_create(unsigned port, VirtIO::Console&); + void handle_queue_update(Badge, u16 queue_index); void set_open(Badge, bool state) { m_open = state; } @@ -35,6 +36,8 @@ public: private: constexpr static size_t RINGBUFFER_SIZE = 2 * PAGE_SIZE; + ConsolePort(unsigned port, VirtIO::Console& console, NonnullOwnPtr receive_buffer, NonnullOwnPtr transmit_buffer); + virtual StringView class_name() const override { return "VirtIOConsolePort"sv; } virtual bool can_read(const OpenFileDescription&, u64) const override; @@ -47,8 +50,8 @@ private: u16 m_receive_queue {}; u16 m_transmit_queue {}; - OwnPtr m_receive_buffer; - OwnPtr m_transmit_buffer; + NonnullOwnPtr m_receive_buffer; + NonnullOwnPtr m_transmit_buffer; VirtIO::Console& m_console; unsigned m_port;