diff options
Diffstat (limited to 'sys/kern/kern_syslog.c')
-rw-r--r-- | sys/kern/kern_syslog.c | 168 |
1 files changed, 0 insertions, 168 deletions
diff --git a/sys/kern/kern_syslog.c b/sys/kern/kern_syslog.c deleted file mode 100644 index 86877e0..0000000 --- a/sys/kern/kern_syslog.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Hyra nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/syslog.h> -#include <sys/machdep.h> -#include <sys/tty.h> -#include <sys/cdefs.h> -#include <sys/timer.h> -#include <sys/spinlock.h> -#include <dev/vcons/vcons.h> -#include <fs/procfs.h> -#include <string.h> - -#if defined(__KMSG_BUF_SHIFT) -#define KMSG_BUF_SHIFT __KMSG_BUF_SHIFT -#else -#define KMSG_BUF_SHIFT 12 -#endif - -#define KMSG_BUF_SIZE (1 << KMSG_BUF_SHIFT) - -__STATIC_ASSERT(KMSG_BUF_SHIFT <= 16, "Log buffer shift too large!\n"); - -static char kmsg_buf[KMSG_BUF_SIZE]; -static size_t kmsg_buf_idx = 0; -static struct proc_entry *kmsg_proc; -static struct spinlock lock = {0}; - -struct vcons_screen g_syslog_screen = {0}; -bool g_syslog_use_tty = true; - -static inline void -kmsg_buf_putc(char c) -{ - kmsg_buf[kmsg_buf_idx++] = c; - kmsg_buf[kmsg_buf_idx] = '\0'; - if (kmsg_buf_idx >= (KMSG_BUF_SIZE - 1)) - kmsg_buf_idx = 0; -} - -static int -proc_kmsg_read(struct proc_entry *p, struct sio_txn *sio) -{ - if (sio->len > KMSG_BUF_SIZE) - sio->len = KMSG_BUF_SIZE; - - memcpy(sio->buf, kmsg_buf, sio->len); - return sio->len; -} - -static void -syslog_write(const char *s, size_t len) -{ - size_t tmp_len = len; - const char *tmp_s = s; - - while (tmp_len--) { -#if defined(__SERIAL_DEBUG) - serial_dbgch(*tmp_s); -#endif /* defined(__SERIAL_DEBUG) */ - kmsg_buf_putc(*tmp_s); - if (g_syslog_use_tty) - tty_putc(&g_root_tty, *tmp_s, TTY_SOURCE_RAW); - - ++tmp_s; - } - - tty_flush(&g_root_tty); -} - -/* - * XXX: Not serialized - */ -void -vkprintf(const char *fmt, va_list *ap) -{ - char buffer[1024] = {0}; - - vsnprintf(buffer, sizeof(buffer), fmt, *ap); - syslog_write(buffer, strlen(buffer)); -} - -void -kprintf(const char *fmt, ...) -{ - va_list ap; - char timestamp[64] = "[ 0.000000] "; - bool has_counter = true; - bool use_timestamp = true; - const char *fmt_p = fmt; - struct timer tmr = {0}; - - spinlock_acquire(&lock); - - /* - * If the first char is OMIT_TIMESTAMP, then we won't - * print out the timestamp. - */ - if (*fmt_p == OMIT_TIMESTAMP[0]) { - ++fmt_p; - use_timestamp = false; - } - - /* See if we can use the counter */ - if (req_timer(TIMER_GP, &tmr) != 0) - has_counter = false; - - /* If we can use the counter, format the timestamp */ - if (has_counter) { - if (tmr.get_time_sec != NULL && tmr.get_time_usec != NULL) - snprintf(timestamp, sizeof(timestamp), "[ %d.%06d] ", - tmr.get_time_sec(), tmr.get_time_usec()); - - } - - if (use_timestamp) { - syslog_write(timestamp, strlen(timestamp)); - } - - va_start(ap, fmt); - vkprintf(fmt_p, &ap); - va_end(ap); - - spinlock_release(&lock); -} - -void -syslog_init_proc(void) -{ - kmsg_proc = procfs_alloc_entry(); - kmsg_proc->read = proc_kmsg_read; - procfs_add_entry("kmsg", kmsg_proc); -} - -void -syslog_init(void) -{ - g_syslog_screen.bg = 0x000000; - g_syslog_screen.fg = 0x808080; - - vcons_attach(&g_syslog_screen); -} |