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 kprintf_v(const char* component, const char* fmt, ...)
76 kprintf_m(component, fmt, args);
81 __twimap_kprintf_read(struct twimap* map)
83 struct kp_records* __kprecs = twimap_data(map, struct kp_records*);
86 XXX we can foreach all records in a single twimap read call,
87 as records is monotonic increasing by design.
89 struct kp_entry *pos, *n;
90 llist_for_each(pos, n, __kprecs->kp_ent_wp, ents)
92 time_t s = pos->time / 1000;
93 time_t ms = pos->time % 1000;
94 twimap_printf(map, "[%05d.%03d] %s\n", s, ms, pos->content);
99 kprintf_mapping_init()
101 twimap_entry_simple(NULL, "kmsg", &kprecs, __twimap_kprintf_read);
103 EXPORT_TWIFS_PLUGIN(kprintf, kprintf_mapping_init);
107 kprintf_dump_logs() {
108 if (unlikely(!sysconsole)) {
112 struct kp_entry *pos, *n;
113 llist_for_each(pos, n, kprecs.kp_ent_wp, ents)
115 sysconsole->ops.write(sysconsole, pos->content, 0, pos->len);
119 __DEFINE_LXSYSCALL3(void, syslog, int, level,
120 const char*, buf, unsigned int, size)
122 kprintf_put(level, buf, size);