diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-04-18 16:08:52 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-04-18 16:08:52 +0200 |
commit | 3817f5f6191902d2592dab810d074a266d27596e (patch) | |
tree | 2280fd86901020de0cd884d10b29bca2d33f78a8 /Kernel/Devices | |
parent | 3b986da6431bf566fbf75c37e9a040ab3f9d024d (diff) | |
download | serenity-3817f5f6191902d2592dab810d074a266d27596e.zip |
Kernel+LibC: Add a DebugLogDevice that forwards everything to I/O port 0xe9.
This is then used to implement the userspace dbgprintf() in a far more
efficient way than what we had before. :^)
Diffstat (limited to 'Kernel/Devices')
-rw-r--r-- | Kernel/Devices/DebugLogDevice.cpp | 28 | ||||
-rw-r--r-- | Kernel/Devices/DebugLogDevice.h | 17 |
2 files changed, 45 insertions, 0 deletions
diff --git a/Kernel/Devices/DebugLogDevice.cpp b/Kernel/Devices/DebugLogDevice.cpp new file mode 100644 index 0000000000..321cd97d35 --- /dev/null +++ b/Kernel/Devices/DebugLogDevice.cpp @@ -0,0 +1,28 @@ +#include <Kernel/Devices/DebugLogDevice.h> +#include <Kernel/IO.h> + +static DebugLogDevice* s_the; + +DebugLogDevice& DebugLogDevice::the() +{ + ASSERT(s_the); + return *s_the; +} + +DebugLogDevice::DebugLogDevice() + : CharacterDevice(1, 18) +{ + s_the = this; +} + +DebugLogDevice::~DebugLogDevice() +{ +} + +ssize_t DebugLogDevice::write(Process&, const byte* data, ssize_t data_size) +{ + for (int i = 0; i < data_size; ++i) + IO::out8(0xe9, data[i]); + return data_size; +} + diff --git a/Kernel/Devices/DebugLogDevice.h b/Kernel/Devices/DebugLogDevice.h new file mode 100644 index 0000000000..dd6db9f4d2 --- /dev/null +++ b/Kernel/Devices/DebugLogDevice.h @@ -0,0 +1,17 @@ +#include <Kernel/Devices/CharacterDevice.h> + +class DebugLogDevice final : public CharacterDevice { +public: + DebugLogDevice(); + virtual ~DebugLogDevice() override; + + static DebugLogDevice& the(); + +private: + // ^CharacterDevice + virtual ssize_t read(Process&, byte*, ssize_t) override { return 0; } + virtual ssize_t write(Process&, const byte*, ssize_t) override; + virtual bool can_write(Process&) const override { return true; } + virtual bool can_read(Process&) const override { return true; } + virtual const char* class_name() const override { return "DebugLogDevice"; } +}; |