From 58c44c9a8feb8c258dcd85209149c16342995ec7 Mon Sep 17 00:00:00 2001
From: dzwdz
Date: Fri, 1 Jul 2022 20:36:59 +0200
Subject: kernel: add the debug_klog syscall for tracking down process ids

---
 src/init/fs/misc.h  |  5 +++--
 src/init/stdlib.c   | 14 ++++++++++++++
 src/init/stdlib.h   |  2 ++
 src/init/syscalls.c |  4 ++++
 4 files changed, 23 insertions(+), 2 deletions(-)

(limited to 'src/init')

diff --git a/src/init/fs/misc.h b/src/init/fs/misc.h
index e360a25..879be32 100644
--- a/src/init/fs/misc.h
+++ b/src/init/fs/misc.h
@@ -1,4 +1,5 @@
 #pragma once
+#include <init/stdlib.h>
 #include <stdbool.h>
 
 bool fork2_n_mount(const char *path);
@@ -10,5 +11,5 @@ void fs_dir_inject(const char *path);
 /** Mounts something and injects its path into the fs */
 // TODO path needs to have a trailing slash
 #define MOUNT(path, impl) \
-	if (!fork2_n_mount(path)) {impl;} \
-	if (!fork2_n_mount("/"))  fs_dir_inject(path);
+	if (!fork2_n_mount(path)) {_klogf("impl %s", path); impl;} \
+	if (!fork2_n_mount("/"))  {_klogf("dir for %s", path); fs_dir_inject(path);}
diff --git a/src/init/stdlib.c b/src/init/stdlib.c
index cbaed61..d9d882d 100644
--- a/src/init/stdlib.c
+++ b/src/init/stdlib.c
@@ -37,6 +37,20 @@ int snprintf(char *str, size_t len, const char *fmt, ...) {
 	return ret;
 }
 
+int _klogf(const char *fmt, ...) {
+	// idiotic. however, this hack won't matter anyways
+	char buf[256];
+	int ret = 0;
+	char *ptrs[2] = {buf, buf + sizeof buf};
+	va_list argp;
+	va_start(argp, fmt);
+	ret = __printf_internal(fmt, argp, backend_buf, &ptrs);
+	va_end(argp);
+	if (ptrs[0] < ptrs[1]) *ptrs[0] = '\0';
+	_syscall_debug_klog(buf, ret);
+	return ret;
+}
+
 
 int file_open(libc_file *f, const char *path, int flags) {
 	f->pos = 0;
diff --git a/src/init/stdlib.h b/src/init/stdlib.h
index 03e1717..a48391c 100644
--- a/src/init/stdlib.h
+++ b/src/init/stdlib.h
@@ -7,6 +7,8 @@
 int printf(const char *fmt, ...);
 int snprintf(char *str, size_t len, const char *fmt, ...);
 
+int _klogf(const char *fmt, ...); // for kernel debugging only
+
 typedef struct {
 	int fd;
 	int pos;
diff --git a/src/init/syscalls.c b/src/init/syscalls.c
index 5b8950b..6e4c2dc 100644
--- a/src/init/syscalls.c
+++ b/src/init/syscalls.c
@@ -50,3 +50,7 @@ void __user *_syscall_memflag(void __user *addr, size_t len, int flags) {
 	return (void __user *)_syscall(_SYSCALL_MEMFLAG, (int)addr, (int)len, flags, 0);
 }
 
+void _syscall_debug_klog(const void __user *buf, size_t len) {
+	return (void)_syscall(_SYSCALL_DEBUG_KLOG, (int)buf, (int)len, 0, 0);
+}
+
-- 
cgit v1.2.3