mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 10:38:11 +00:00
Kernel: Move a bunch of generic devices code into new subdirectory
This commit is contained in:
parent
9eeda5719e
commit
4617c05a08
27 changed files with 34 additions and 34 deletions
66
Kernel/Devices/Generic/ConsoleDevice.cpp
Normal file
66
Kernel/Devices/Generic/ConsoleDevice.cpp
Normal file
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* 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/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(5, 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 (const auto& 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);
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue