diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2026-05-02 01:32:13 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2026-05-02 01:32:13 +0800 |
| commit | e1561995d4064847de60daf5342f8e7ff69e7e30 (patch) | |
| tree | d71f1a0dc396f836a00da7e51960d4f1401d85ae /na/lib/kprintf.cc | |
| parent | 5b8aaa2c203e456d2ca133b3403224a98aef2816 (diff) | |
| download | lume-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.cc | 68 |
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; +} |
