Files
serenity/Kernel/Devices/Generic/ConsoleDevice.cpp
Liav A. 16244c490a Kernel: Allocate all device major numbers within one known header file
We used to allocate major numbers quite randomly, with no common place
to look them up if needed.
This commit is changing that by placing all major number allocations
under a new C++ namespace, in the API/MajorNumberAllocation.h file.

We also add the foundations of what is needed before we can publish this
information (allocated numbers for block and char devices) to userspace.
2024-07-06 21:42:32 +02:00

68 lines
1.7 KiB
C++

/*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/Platform.h>
#if ARCH(X86_64)
# include <Kernel/Arch/x86_64/BochsDebugOutput.h>
#endif
#include <Kernel/API/MajorNumberAllocation.h>
#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Devices/Generic/ConsoleDevice.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Sections.h>
#include <Kernel/kstdio.h>
namespace Kernel {
Spinlock<LockRank::None> g_console_lock {};
UNMAP_AFTER_INIT NonnullLockRefPtr<ConsoleDevice> ConsoleDevice::must_create()
{
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()
: CharacterDevice(MajorAllocation::CharacterDeviceFamily::Console, 1)
{
}
UNMAP_AFTER_INIT ConsoleDevice::~ConsoleDevice() = default;
bool ConsoleDevice::can_read(Kernel::OpenFileDescription const&, u64) const
{
return false;
}
ErrorOr<size_t> ConsoleDevice::read(OpenFileDescription&, u64, Kernel::UserOrKernelBuffer&, size_t)
{
// FIXME: Implement reading from the console.
// Maybe we could use a ring buffer for this device?
return 0;
}
ErrorOr<size_t> ConsoleDevice::write(OpenFileDescription&, u64, Kernel::UserOrKernelBuffer const& data, size_t size)
{
if (!size)
return 0;
return data.read_buffered<256>(size, [&](ReadonlyBytes readonly_bytes) {
for (auto const& byte : readonly_bytes)
put_char(byte);
return readonly_bytes.size();
});
}
void ConsoleDevice::put_char(char ch)
{
Kernel::SpinlockLocker lock(g_console_lock);
dbgputchar(ch);
m_logbuffer.enqueue(ch);
}
}