ConsoleDevice.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Platform.h>
  7. #if ARCH(X86_64)
  8. # include <Kernel/Arch/x86_64/BochsDebugOutput.h>
  9. #endif
  10. #include <Kernel/Devices/DeviceManagement.h>
  11. #include <Kernel/Devices/Generic/ConsoleDevice.h>
  12. #include <Kernel/Locking/Spinlock.h>
  13. #include <Kernel/Sections.h>
  14. #include <Kernel/kstdio.h>
  15. namespace Kernel {
  16. Spinlock<LockRank::None> g_console_lock {};
  17. UNMAP_AFTER_INIT NonnullLockRefPtr<ConsoleDevice> ConsoleDevice::must_create()
  18. {
  19. auto device_or_error = DeviceManagement::try_create_device<ConsoleDevice>();
  20. VERIFY(!device_or_error.is_error());
  21. return device_or_error.release_value();
  22. }
  23. UNMAP_AFTER_INIT ConsoleDevice::ConsoleDevice()
  24. : CharacterDevice(5, 1)
  25. {
  26. }
  27. UNMAP_AFTER_INIT ConsoleDevice::~ConsoleDevice() = default;
  28. bool ConsoleDevice::can_read(Kernel::OpenFileDescription const&, u64) const
  29. {
  30. return false;
  31. }
  32. ErrorOr<size_t> ConsoleDevice::read(OpenFileDescription&, u64, Kernel::UserOrKernelBuffer&, size_t)
  33. {
  34. // FIXME: Implement reading from the console.
  35. // Maybe we could use a ring buffer for this device?
  36. return 0;
  37. }
  38. ErrorOr<size_t> ConsoleDevice::write(OpenFileDescription&, u64, Kernel::UserOrKernelBuffer const& data, size_t size)
  39. {
  40. if (!size)
  41. return 0;
  42. return data.read_buffered<256>(size, [&](ReadonlyBytes readonly_bytes) {
  43. for (auto const& byte : readonly_bytes)
  44. put_char(byte);
  45. return readonly_bytes.size();
  46. });
  47. }
  48. void ConsoleDevice::put_char(char ch)
  49. {
  50. Kernel::SpinlockLocker lock(g_console_lock);
  51. dbgputchar(ch);
  52. m_logbuffer.enqueue(ch);
  53. }
  54. }