feat: kprintf now goes into dedicated pseudo-dev rather than flooding the framebuffer
[lunaix-os.git] / lunaix-os / kernel / kprint / kp_records.c
diff --git a/lunaix-os/kernel/kprint/kp_records.c b/lunaix-os/kernel/kprint/kp_records.c
new file mode 100644 (file)
index 0000000..d323bc1
--- /dev/null
@@ -0,0 +1,54 @@
+#include <klibc/string.h>
+#include <lunaix/clock.h>
+#include <lunaix/mm/valloc.h>
+#include <lunaix/spike.h>
+#include <lunaix/syslog.h>
+
+#include "kp_records.h"
+
+struct kp_records*
+kp_rec_create(int max_recs)
+{
+    struct kp_records* recs = (struct kp_records*)valloc(KP_RECS_SIZE);
+
+    *recs = (struct kp_records){ .max_recs = max_recs,
+                                 .log_lvl = KLOG_DEBUG,
+                                 .kp_ent_wp = &recs->kp_ents.ents };
+
+    llist_init_head(&recs->kp_ents.ents);
+
+    return recs;
+}
+
+static inline int
+kp_recs_full(struct kp_records* recs)
+{
+    return recs->cur_recs >= recs->max_recs;
+}
+
+void
+kp_rec_put(struct kp_records* recs, int lvl, char* content, size_t len)
+{
+    assert(len < 256);
+
+    struct kp_entry* ent;
+    if (!kp_recs_full(recs)) {
+        assert(recs->kp_ent_wp == &recs->kp_ents.ents);
+
+        ent = (struct kp_entry*)vzalloc(KP_ENT_SIZE);
+        llist_append(&recs->kp_ents.ents, &ent->ents);
+        recs->cur_recs++;
+    } else {
+        recs->kp_ent_wp = recs->kp_ent_wp->next;
+        ent = container_of(recs->kp_ent_wp, struct kp_entry, ents);
+    }
+
+    vfree_safe(ent->content);
+
+    char* _content = valloc(len);
+    memcpy(_content, content, len);
+
+    ent->lvl = lvl;
+    ent->content = _content;
+    ent->time = clock_systime();
+}
\ No newline at end of file