X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/1eeed1150149b63d6e49e033697454bc12b533b9..9e622bd093f8e106b7e8a00f55620f13cc5cd87f:/lunaix-os/kernel/kprint/kprintf.c diff --git a/lunaix-os/kernel/kprint/kprintf.c b/lunaix-os/kernel/kprint/kprintf.c index 158a799..dc46628 100644 --- a/lunaix-os/kernel/kprint/kprintf.c +++ b/lunaix-os/kernel/kprint/kprintf.c @@ -1,9 +1,11 @@ #include #include #include +#include #include #include #include +#include #include @@ -11,11 +13,11 @@ #include "kp_records.h" -#define MAX_BUFSZ 512 #define MAX_BUFSZ_HLF 256 #define MAX_KPENT_NUM 1024 -static char tmp_buf[MAX_BUFSZ]; +static char tmp_buf[MAX_BUFSZ_HLF * 2]; +static DEFINE_FLIPBUF(fmtbuf, MAX_BUFSZ_HLF, tmp_buf); static struct kp_records kprecs = { .kp_ents = { .ents = { .next = &kprecs.kp_ents.ents, @@ -23,7 +25,7 @@ static struct kp_records kprecs = { .max_recs = MAX_KPENT_NUM, .kp_ent_wp = &kprecs.kp_ents.ents }; -export_symbol(debug, kprecs); +export_symbol(debug, kprintf, kprecs); static char* shift_level(const char* str, int* level) @@ -38,18 +40,44 @@ shift_level(const char* str, int* level) return str; } +static inline void +__put_console(const struct kp_entry* ent) +{ + char* buf; + time_t s, ms; + size_t sz; + + if (unlikely(!sysconsole)) { + return; + } + + s = ent->time / 1000; + ms = ent->time % 1000; + buf = flipbuf_flip(&fmtbuf); + sz = ksnprintf(buf, MAX_BUFSZ_HLF, + "[%04d.%03d] %s", s, ms, ent->content); + + sysconsole->ops.write(sysconsole, buf, 0, sz); +} + +static inline void +kprintf_put(int level, const char* buf, size_t sz) +{ + __put_console(kprec_put(&kprecs, level, buf, sz)); +} + 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\n", component, fmt); + char* buf; + size_t sz; - size_t sz = ksnprintfv(tmp_buf, buf, MAX_BUFSZ_HLF, args); - kprec_put(&kprecs, level, tmp_buf, sz); + buf = flipbuf_top(&fmtbuf); + ksnprintf(buf, MAX_BUFSZ_HLF, "%s: %s\n", component, fmt); - if (likely(sysconsole)) { - sysconsole->ops.write(sysconsole, tmp_buf, 0, sz); - } + sz = ksnprintfv(flipbuf_flip(&fmtbuf), buf, MAX_BUFSZ_HLF, args); + + kprintf_put(level, flipbuf_top(&fmtbuf), sz); } void @@ -61,8 +89,17 @@ kprintf_m(const char* component, const char* fmt, va_list args) kprintf_ml(component, level, fmt, args); } +void +kprintf_v(const char* component, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + kprintf_m(component, fmt, args); + va_end(args); +} + static void -__twimap_kprintf_read(struct twimap* map) +__twimap_read_kmsg(struct twimap* map) { struct kp_records* __kprecs = twimap_data(map, struct kp_records*); @@ -75,14 +112,14 @@ __twimap_kprintf_read(struct twimap* map) { time_t s = pos->time / 1000; time_t ms = pos->time % 1000; - twimap_printf(map, "[%05d.%03d] %s\n", s, ms, pos->content); + twimap_printf(map, "[%05d.%03d] %s", s, ms, pos->content); } } static void kprintf_mapping_init() { - twimap_entry_simple(NULL, "kmsg", &kprecs, __twimap_kprintf_read); + twimap_export_value(NULL, kmsg, FSACL_ugR, &kprecs); } EXPORT_TWIFS_PLUGIN(kprintf, kprintf_mapping_init); @@ -96,11 +133,12 @@ kprintf_dump_logs() { struct kp_entry *pos, *n; llist_for_each(pos, n, kprecs.kp_ent_wp, ents) { - sysconsole->ops.write(sysconsole, pos->content, 0, pos->len); + __put_console(pos); } } -__DEFINE_LXSYSCALL3(void, syslog, int, level, const char*, fmt, va_list, args) +__DEFINE_LXSYSCALL3(void, syslog, int, level, + const char*, buf, unsigned int, size) { - kprintf_ml("syslog", level, fmt, args); + kprintf_put(level, buf, size); } \ No newline at end of file