summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/HALKit/ARM64/HalDebugOutput.cc
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-11-23 21:06:27 -0500
committerGitHub <noreply@github.com>2025-11-23 21:06:27 -0500
commit23040fad647634c08697451fc22ee2ca999629c8 (patch)
tree72888f88c7728c82f3f6df1f4f70591de15eab36 /src/kernel/HALKit/ARM64/HalDebugOutput.cc
parente5cc7351f0577b54c528fb827a7c7e6306c3e843 (diff)
parent83d870e58457a1d335a1d9b9966a6a1887cc297b (diff)
Merge pull request #81 from nekernel-org/dev
feat! breaking changes on kernel sources.
Diffstat (limited to 'src/kernel/HALKit/ARM64/HalDebugOutput.cc')
-rw-r--r--src/kernel/HALKit/ARM64/HalDebugOutput.cc71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/kernel/HALKit/ARM64/HalDebugOutput.cc b/src/kernel/HALKit/ARM64/HalDebugOutput.cc
new file mode 100644
index 00000000..c0da9c3a
--- /dev/null
+++ b/src/kernel/HALKit/ARM64/HalDebugOutput.cc
@@ -0,0 +1,71 @@
+/* ========================================
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
+
+======================================== */
+
+#include <ArchKit/ArchKit.h>
+#include <KernelKit/DebugOutput.h>
+#include <NeKit/New.h>
+#include <NeKit/Utils.h>
+
+namespace Kernel {
+EXTERN_C void ke_io_write(DeviceInterface<const Char*>* self, const Char* bytes) {
+#ifdef __DEBUG__
+ if (*bytes == 0) return;
+
+ SizeT index = 0;
+ SizeT len = 0;
+
+ index = 0;
+ len = rt_string_len(bytes, 256U);
+
+ volatile UInt8* uart_ptr = (UInt8*) 0x09000000;
+
+ while (index < len) {
+ if (bytes[index] == '\r') *uart_ptr = '\r';
+
+ *uart_ptr = bytes[index] == '\r' ? '\n' : bytes[index];
+ ++index;
+ }
+#endif // __DEBUG__
+}
+
+TerminalDevice::~TerminalDevice() = default;
+
+EXTERN_C void ke_io_read(DeviceInterface<const Char*>* self, const Char* bytes) {
+#ifdef __DEBUG__
+ SizeT index = 0;
+
+ volatile UInt8* uart_ptr = (UInt8*) 0x09000000;
+
+ ///! TODO: Look on how to wait for the UART to complete.
+ while (Yes) {
+ auto in = *uart_ptr;
+
+ ///! If enter pressed then break.
+ if (in == 0xD) {
+ break;
+ }
+
+ if (in < '0' || in < 'A' || in < 'a') {
+ if (in != '@' || in != '!' || in != '?' || in != '.' || in != '/' || in != ':') {
+ continue;
+ }
+ }
+
+ ((char*) bytes)[index] = in;
+
+ ++index;
+ }
+
+ ((char*) bytes)[index] = 0;
+#endif // __DEBUG__
+}
+
+TerminalDevice TerminalDevice::The() noexcept {
+ TerminalDevice out(Kernel::ke_io_write, Kernel::ke_io_read);
+ return out;
+}
+
+} // namespace Kernel