Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/CircularQueue.h>
10#include <AK/Vector.h>
11#include <Kernel/Devices/CharacterDevice.h>
12
13namespace Kernel {
14
15extern Spinlock<LockRank::None> g_console_lock;
16
17class ConsoleDevice final : public CharacterDevice {
18 friend class DeviceManagement;
19
20public:
21 static NonnullLockRefPtr<ConsoleDevice> must_create();
22
23 virtual ~ConsoleDevice() override;
24
25 // ^CharacterDevice
26 virtual bool can_read(Kernel::OpenFileDescription const&, u64) const override;
27 virtual bool can_write(Kernel::OpenFileDescription const&, u64) const override { return true; }
28 virtual ErrorOr<size_t> read(OpenFileDescription&, u64, Kernel::UserOrKernelBuffer&, size_t) override;
29 virtual ErrorOr<size_t> write(OpenFileDescription&, u64, Kernel::UserOrKernelBuffer const&, size_t) override;
30 virtual StringView class_name() const override { return "Console"sv; }
31 // ^Device
32 virtual bool is_openable_by_jailed_processes() const override { return true; }
33
34 void put_char(char);
35
36 CircularQueue<char, 16384> const& logbuffer() const { return m_logbuffer; }
37
38private:
39 ConsoleDevice();
40 CircularQueue<char, 16384> m_logbuffer;
41};
42
43}