From 421a83d2029330291aeee41607ec7bb8c434a2a8 Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Sun, 22 Mar 2026 14:25:49 +0100 Subject: [PATCH] Added logging, %lu and %p format specifiers to vnsprintf() --- config.mk | 2 ++ kernel/src/vsnprintf.c | 19 ++++++++++++++++--- makefile | 4 +++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/config.mk b/config.mk index 41b639e..ebbaa98 100644 --- a/config.mk +++ b/config.mk @@ -33,4 +33,6 @@ IMG_SIZE = 256 # 256MB # Qemu Q_MEMORY = 256M Q_AUDIODEV = pipewire +Q_LOGGING = int,cpu_reset +Q_LOGFILE = qemu.log diff --git a/kernel/src/vsnprintf.c b/kernel/src/vsnprintf.c index 3e60a63..0556998 100644 --- a/kernel/src/vsnprintf.c +++ b/kernel/src/vsnprintf.c @@ -124,6 +124,7 @@ int vsnprintf(char* buf, size_t n, char* fmt, va_list ap) { char pad = ' '; int width = 0; int prec = -1; + int is_long = 0; if (*fmt == '-') { left = 1; @@ -149,10 +150,22 @@ int vsnprintf(char* buf, size_t n, char* fmt, va_list ap) { } } + if (*fmt == 'l') { + is_long = 1; + fmt++; + if (*fmt == 'l') { // handle ll + fmt++; + } + } + switch (*fmt) { - case 'd': fmt_int(buf, n, &idx, va_arg(ap, int), width, pad, left); break; - case 'u': fmt_uint(buf, n, &idx, va_arg(ap, unsigned int), 10, width, pad, left); break; - case 'x': fmt_uint(buf, n, &idx, va_arg(ap, unsigned int), 16, width, pad, left); break; + case 'd': fmt_int(buf, n, &idx, is_long ? va_arg(ap, int64_t) : va_arg(ap, int32_t), width, pad, left); break; + case 'u': fmt_uint(buf, n, &idx, is_long ? va_arg(ap, uint64_t) : va_arg(ap, uint32_t), 10, width, pad, left); break; + case 'x': fmt_uint(buf, n, &idx, is_long ? va_arg(ap, uint64_t) : va_arg(ap, uint32_t), 16, width, pad, left); break; + case 'p': + fmt_string(buf, n, &idx, "0x", 2, 0, ' ', 0); + fmt_uint(buf, n, &idx, va_arg(ap, uintptr_t), 16, 16, '0', 0); + break; case 'f': fmt_float(buf, n, &idx, va_arg(ap, double), prec, width, pad, left); break; case 's': { char* s = va_arg(ap, char*); diff --git a/makefile b/makefile index 015393c..dc9b69b 100644 --- a/makefile +++ b/makefile @@ -44,6 +44,7 @@ $(MODULES): clean: rm -f $(TARGET) rm -fr $(SYSROOT) + rm -f $(Q_LOGFILE) for m in $(MODULES); do $(MAKE) -C $$m clean; done qemu: @@ -51,5 +52,6 @@ qemu: -drive format=raw,file=$(TARGET),index=0,media=disk\ -m $(Q_MEMORY) -accel tcg -monitor stdio -net none\ -rtc base=localtime,clock=host,driftfix=slew\ - -audiodev $(Q_AUDIODEV),id=audio0 -machine pcspk-audiodev=audio0 + -audiodev $(Q_AUDIODEV),id=audio0 -machine pcspk-audiodev=audio0\ + -d $(Q_LOGGING) -D $(Q_LOGFILE)