1 #include <lunaix/fs/twifs.h>
2 #include <lunaix/fs/twimap.h>
3 #include <lunaix/syscall.h>
4 #include <lunaix/syscall_utils.h>
5 #include <lunaix/syslog.h>
6 #include <lunaix/device.h>
7 #include <lunaix/owloysius.h>
11 #include <klibc/strfmt.h>
13 #include "kp_records.h"
16 #define MAX_BUFSZ_HLF 256
17 #define MAX_KPENT_NUM 1024
19 static char tmp_buf[MAX_BUFSZ];
21 static struct kp_records kprecs = {
22 .kp_ents = { .ents = { .next = &kprecs.kp_ents.ents,
23 .prev = &kprecs.kp_ents.ents } },
24 .max_recs = MAX_KPENT_NUM,
25 .kp_ent_wp = &kprecs.kp_ents.ents
27 export_symbol(debug, kprintf, kprecs);
30 shift_level(const char* str, int* level)
32 if (str[0] == KMSG_LVLSTART) {
33 *level = KMSG_LOGLEVEL(str[1]);
43 kprintf_put(int level, const char* buf, size_t sz)
45 kprec_put(&kprecs, level, buf, sz);
47 if (likely(sysconsole)) {
48 sysconsole->ops.write(sysconsole, buf, 0, sz);
53 kprintf_ml(const char* component, int level, const char* fmt, va_list args)
55 char* buf = &tmp_buf[MAX_BUFSZ_HLF];
56 ksnprintf(buf, MAX_BUFSZ_HLF, "%s: %s\n", component, fmt);
58 size_t sz = ksnprintfv(tmp_buf, buf, MAX_BUFSZ_HLF, args);
59 kprintf_put(level, tmp_buf, sz);
63 kprintf_m(const char* component, const char* fmt, va_list args)
66 fmt = shift_level(fmt, &level);
68 kprintf_ml(component, level, fmt, args);
72 __twimap_kprintf_read(struct twimap* map)
74 struct kp_records* __kprecs = twimap_data(map, struct kp_records*);
77 XXX we can foreach all records in a single twimap read call,
78 as records is monotonic increasing by design.
80 struct kp_entry *pos, *n;
81 llist_for_each(pos, n, __kprecs->kp_ent_wp, ents)
83 time_t s = pos->time / 1000;
84 time_t ms = pos->time % 1000;
85 twimap_printf(map, "[%05d.%03d] %s\n", s, ms, pos->content);
90 kprintf_mapping_init()
92 twimap_entry_simple(NULL, "kmsg", &kprecs, __twimap_kprintf_read);
94 EXPORT_TWIFS_PLUGIN(kprintf, kprintf_mapping_init);
99 if (unlikely(!sysconsole)) {
103 struct kp_entry *pos, *n;
104 llist_for_each(pos, n, kprecs.kp_ent_wp, ents)
106 sysconsole->ops.write(sysconsole, pos->content, 0, pos->len);
110 __DEFINE_LXSYSCALL3(void, syslog, int, level,
111 const char*, buf, unsigned int, size)
113 kprintf_put(level, buf, size);