mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 08:37:34 +00:00
Kernel: Make VirtIO::ConsolePort construction OOM-fallible
This commit is contained in:
parent
94a39db31d
commit
ac4583660b
2 changed files with 16 additions and 6 deletions
|
@ -12,13 +12,20 @@ namespace Kernel::VirtIO {
|
||||||
|
|
||||||
unsigned ConsolePort::next_device_id = 0;
|
unsigned ConsolePort::next_device_id = 0;
|
||||||
|
|
||||||
ConsolePort::ConsolePort(unsigned port, VirtIO::Console& console)
|
ErrorOr<NonnullRefPtr<ConsolePort>> 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<Memory::RingBuffer> receive_buffer, NonnullOwnPtr<Memory::RingBuffer> transmit_buffer)
|
||||||
: CharacterDevice(229, next_device_id++)
|
: CharacterDevice(229, next_device_id++)
|
||||||
|
, m_receive_buffer(move(receive_buffer))
|
||||||
|
, m_transmit_buffer(move(transmit_buffer))
|
||||||
, m_console(console)
|
, m_console(console)
|
||||||
, m_port(port)
|
, 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_receive_queue = m_port == 0 ? 0 : m_port * 2 + 2;
|
||||||
m_transmit_queue = m_port == 0 ? 1 : m_port * 2 + 3;
|
m_transmit_queue = m_port == 0 ? 1 : m_port * 2 + 3;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,8 @@ class Console;
|
||||||
class ConsolePort
|
class ConsolePort
|
||||||
: public CharacterDevice {
|
: public CharacterDevice {
|
||||||
public:
|
public:
|
||||||
explicit ConsolePort(unsigned port, VirtIO::Console&);
|
static ErrorOr<NonnullRefPtr<ConsolePort>> try_create(unsigned port, VirtIO::Console&);
|
||||||
|
|
||||||
void handle_queue_update(Badge<VirtIO::Console>, u16 queue_index);
|
void handle_queue_update(Badge<VirtIO::Console>, u16 queue_index);
|
||||||
|
|
||||||
void set_open(Badge<VirtIO::Console>, bool state) { m_open = state; }
|
void set_open(Badge<VirtIO::Console>, bool state) { m_open = state; }
|
||||||
|
@ -35,6 +36,8 @@ public:
|
||||||
private:
|
private:
|
||||||
constexpr static size_t RINGBUFFER_SIZE = 2 * PAGE_SIZE;
|
constexpr static size_t RINGBUFFER_SIZE = 2 * PAGE_SIZE;
|
||||||
|
|
||||||
|
ConsolePort(unsigned port, VirtIO::Console& console, NonnullOwnPtr<Memory::RingBuffer> receive_buffer, NonnullOwnPtr<Memory::RingBuffer> transmit_buffer);
|
||||||
|
|
||||||
virtual StringView class_name() const override { return "VirtIOConsolePort"sv; }
|
virtual StringView class_name() const override { return "VirtIOConsolePort"sv; }
|
||||||
|
|
||||||
virtual bool can_read(const OpenFileDescription&, u64) const override;
|
virtual bool can_read(const OpenFileDescription&, u64) const override;
|
||||||
|
@ -47,8 +50,8 @@ private:
|
||||||
u16 m_receive_queue {};
|
u16 m_receive_queue {};
|
||||||
u16 m_transmit_queue {};
|
u16 m_transmit_queue {};
|
||||||
|
|
||||||
OwnPtr<Memory::RingBuffer> m_receive_buffer;
|
NonnullOwnPtr<Memory::RingBuffer> m_receive_buffer;
|
||||||
OwnPtr<Memory::RingBuffer> m_transmit_buffer;
|
NonnullOwnPtr<Memory::RingBuffer> m_transmit_buffer;
|
||||||
|
|
||||||
VirtIO::Console& m_console;
|
VirtIO::Console& m_console;
|
||||||
unsigned m_port;
|
unsigned m_port;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue