X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/8c06c883e7b13c115d5ff207f79d4b68fccd5ad6..7b8a1bcad75628f9add4590db2bb9b8e418ee8eb:/lunaix-os/kernel/kprint/kprintf.c diff --git a/lunaix-os/kernel/kprint/kprintf.c b/lunaix-os/kernel/kprint/kprintf.c index c3bd04c..310b1f6 100644 --- a/lunaix-os/kernel/kprint/kprintf.c +++ b/lunaix-os/kernel/kprint/kprintf.c @@ -2,6 +2,10 @@ #include #include #include +#include +#include + +#include #include @@ -19,6 +23,7 @@ static struct kp_records kprecs = { .max_recs = MAX_KPENT_NUM, .kp_ent_wp = &kprecs.kp_ents.ents }; +export_symbol(debug, kprecs); static char* shift_level(const char* str, int* level) @@ -33,38 +38,44 @@ shift_level(const char* str, int* level) return str; } -static void -__kprintf_level(const char* component, int level, const char* fmt, va_list args) +static inline void +kprintf_ml(const char* component, int level, const char* fmt, va_list args) { char* buf = &tmp_buf[MAX_BUFSZ_HLF]; - ksnprintf(buf, MAX_BUFSZ_HLF, "%s: %s", component, fmt); + ksnprintf(buf, MAX_BUFSZ_HLF, "%s: %s\n", component, fmt); size_t sz = ksnprintfv(tmp_buf, buf, MAX_BUFSZ_HLF, args); - kp_rec_put(&kprecs, level, tmp_buf, sz); + kprec_put(&kprecs, level, tmp_buf, sz); + + if (likely(sysconsole)) { + sysconsole->ops.write(sysconsole, tmp_buf, 0, sz); + } } void -__kprintf(const char* component, const char* fmt, va_list args) +kprintf_m(const char* component, const char* fmt, va_list args) { int level; fmt = shift_level(fmt, &level); - __kprintf_level(component, level, fmt, args); + kprintf_ml(component, level, fmt, args); } static void __twimap_kprintf_read(struct twimap* map) { - struct kp_records* kprecs = twimap_data(map, struct kp_records*); + struct kp_records* __kprecs = twimap_data(map, struct kp_records*); /* XXX we can foreach all records in a single twimap read call, as records is monotonic increasing by design. */ struct kp_entry *pos, *n; - llist_for_each(pos, n, kprecs->kp_ent_wp, ents) + llist_for_each(pos, n, __kprecs->kp_ent_wp, ents) { - twimap_printf(map, "[%05d] %s\n", pos->time, pos->content); + time_t s = pos->time / 1000; + time_t ms = pos->time % 1000; + twimap_printf(map, "[%05d.%03d] %s\n", s, ms, pos->content); } } @@ -75,7 +86,21 @@ kprintf_mapping_init() } EXPORT_TWIFS_PLUGIN(kprintf, kprintf_mapping_init); + +static void kprintf_init() { + if (unlikely(!sysconsole)) { + return; + } + + struct kp_entry *pos, *n; + llist_for_each(pos, n, kprecs.kp_ent_wp, ents) + { + sysconsole->ops.write(sysconsole, pos->content, 0, pos->len); + } +} +lunaix_initfn(kprintf_init, call_on_postboot); + __DEFINE_LXSYSCALL3(void, syslog, int, level, const char*, fmt, va_list, args) { - __kprintf_level("syslog", level, fmt, args); + kprintf_ml("syslog", level, fmt, args); } \ No newline at end of file