summaryrefslogtreecommitdiff
path: root/na/lib/kprintf.cc
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-05-02 01:32:13 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-05-02 01:32:13 +0800
commite1561995d4064847de60daf5342f8e7ff69e7e30 (patch)
treed71f1a0dc396f836a00da7e51960d4f1401d85ae /na/lib/kprintf.cc
parent5b8aaa2c203e456d2ca133b3403224a98aef2816 (diff)
downloadlume-e1561995d4064847de60daf5342f8e7ff69e7e30.tar.gz
lume-e1561995d4064847de60daf5342f8e7ff69e7e30.tar.xz
feat: implement kernel logging and formatted output subsystems
Diffstat (limited to 'na/lib/kprintf.cc')
-rw-r--r--na/lib/kprintf.cc68
1 files changed, 68 insertions, 0 deletions
diff --git a/na/lib/kprintf.cc b/na/lib/kprintf.cc
new file mode 100644
index 0000000..ddd2e59
--- /dev/null
+++ b/na/lib/kprintf.cc
@@ -0,0 +1,68 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/* Copyright (C) 2026 Richard Qin */
+
+/*
+ * kprintf.cc — Kernel formatted output
+ *
+ * Uses mpaland/printf's vsnprintf_ as the core formatting engine.
+ * All kernel output ultimately goes through this module.
+ *
+ * Architecture:
+ * vsnprintf_() ← pure formatting, writes to buffer
+ * ↓
+ * kprintf() ← format + emit to UART via early_putc
+ * kvprintf() ← va_list variant
+ * ksnprintf() ← format into caller's buffer
+ */
+
+#include <lume/kprintf.h>
+#include <lume/console.h>
+#include "printf.h"
+
+/* ------------------------------------------------------------------ */
+/* _putchar: required by mpaland/printf for printf_() / vprintf_() */
+/* ------------------------------------------------------------------ */
+
+void _putchar(char character)
+{
+ early_putc(character);
+}
+
+/* ------------------------------------------------------------------ */
+/* Public API */
+/* ------------------------------------------------------------------ */
+
+extern "C" int kprintf(const char* fmt, ...)
+{
+ char buf[256];
+ va_list va;
+ va_start(va, fmt);
+ int len = vsnprintf_(buf, sizeof(buf), fmt, va);
+ va_end(va);
+
+ /* Emit to console */
+ for (int i = 0; i < len && buf[i] != '\0'; ++i) {
+ early_putc(buf[i]);
+ }
+ return len;
+}
+
+extern "C" int kvprintf(const char* fmt, va_list va)
+{
+ char buf[256];
+ int len = vsnprintf_(buf, sizeof(buf), fmt, va);
+
+ for (int i = 0; i < len && buf[i] != '\0'; ++i) {
+ early_putc(buf[i]);
+ }
+ return len;
+}
+
+extern "C" int ksnprintf(char* buf, int count, const char* fmt, ...)
+{
+ va_list va;
+ va_start(va, fmt);
+ int ret = vsnprintf_(buf, (size_t)count, fmt, va);
+ va_end(va);
+ return ret;
+}