summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/amd64/conf/GENERIC1
-rw-r--r--sys/fs/procfs_subr.c2
-rw-r--r--sys/include/sys/syslog.h3
-rw-r--r--sys/kern/init_main.c3
-rw-r--r--sys/kern/kern_syslog.c50
5 files changed, 58 insertions, 1 deletions
diff --git a/sys/arch/amd64/conf/GENERIC b/sys/arch/amd64/conf/GENERIC
index b4fb29d..032519d 100644
--- a/sys/arch/amd64/conf/GENERIC
+++ b/sys/arch/amd64/conf/GENERIC
@@ -6,3 +6,4 @@ option PANIC_BEEP yes
// Kernel constants
setval PANIC_BEEP_HZ 1050
setval SCHED_NQUEUE 4
+setval KMSG_BUF_SHIFT 16
diff --git a/sys/fs/procfs_subr.c b/sys/fs/procfs_subr.c
index c1d77ba..8b95919 100644
--- a/sys/fs/procfs_subr.c
+++ b/sys/fs/procfs_subr.c
@@ -29,6 +29,7 @@
#include <sys/panic.h>
#include <sys/intr.h>
+#include <sys/syslog.h>
#include <machine/cpu.h>
#include <fs/procfs.h>
#include <vm/vm.h>
@@ -109,4 +110,5 @@ procfs_populate(void)
procfs_add_entry("memstat", memstat);
intr_init_proc();
+ syslog_init_proc();
}
diff --git a/sys/include/sys/syslog.h b/sys/include/sys/syslog.h
index 3015f6b..12febbc 100644
--- a/sys/include/sys/syslog.h
+++ b/sys/include/sys/syslog.h
@@ -34,6 +34,7 @@
#ifndef _SYS_SYSLOG_H_
#define _SYS_SYSLOG_H_
+#include <sys/types.h>
#include <stdarg.h>
#include <dev/vcons/vcons.h>
@@ -56,10 +57,12 @@
kprintf(__VA_ARGS__);
void syslog_init(void);
+void syslog_init_proc(void);
void kprintf(const char *fmt, ...);
void vkprintf(const char *fmt, va_list *ap);
extern struct vcons_screen g_syslog_screen;
+extern bool g_syslog_use_tty;
#endif /* defined(_KERNEL) */
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index 10cd90e..5f5e8c3 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -102,6 +102,9 @@ main(void)
sched_init();
ci = this_cpu();
+ /* Stop writing kernel messages to TTY */
+ g_syslog_use_tty = false;
+
__TRY_CALL(ap_bootstrap, ci);
sched_enter();
diff --git a/sys/kern/kern_syslog.c b/sys/kern/kern_syslog.c
index 88ae8bc..712b69b 100644
--- a/sys/kern/kern_syslog.c
+++ b/sys/kern/kern_syslog.c
@@ -30,10 +30,46 @@
#include <sys/syslog.h>
#include <sys/machdep.h>
#include <sys/tty.h>
+#include <sys/cdefs.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;
+
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)
@@ -45,7 +81,11 @@ syslog_write(const char *s, size_t len)
#if defined(__SERIAL_DEBUG)
serial_dbgch(*tmp_s);
#endif /* defined(__SERIAL_DEBUG) */
- tty_putc(&g_root_tty, *tmp_s++, TTY_SOURCE_RAW);
+ 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);
@@ -71,6 +111,14 @@ kprintf(const char *fmt, ...)
}
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;