summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-02-22 02:21:55 -0500
committerIan Moffett <ian@osmora.org>2025-02-22 02:21:55 -0500
commit218187d55e26c8bc9bd25881d5e84b38a3c28213 (patch)
tree5ccd656cfa1362cf211c622a0c50125cf276103e
parent34e8460892c06ebff138f23e42536f8cf9d13e78 (diff)
kernel: dev: Add /dev/console
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r--sys/dev/cons/cons.c48
-rw-r--r--sys/include/dev/cons/cons.h1
-rw-r--r--sys/kern/init_main.c3
3 files changed, 51 insertions, 1 deletions
diff --git a/sys/dev/cons/cons.c b/sys/dev/cons/cons.c
index c3a3197..0de5590 100644
--- a/sys/dev/cons/cons.c
+++ b/sys/dev/cons/cons.c
@@ -30,13 +30,16 @@
#include <sys/param.h>
#include <sys/types.h>
#include <sys/ascii.h>
+#include <sys/device.h>
#include <dev/video/fbdev.h>
#include <dev/cons/font.h>
#include <dev/cons/cons.h>
+#include <fs/devfs.h>
#include <vm/dynalloc.h>
#include <string.h>
struct cons_screen g_root_scr = {0};
+static struct cdevsw cons_cdevsw;
/*
* Create a chracter descriptor for drawing
@@ -89,7 +92,7 @@ static void
cons_draw_cursor(struct cons_screen *scr, uint32_t color)
{
size_t idx;
-
+
for (uint32_t cy = 0; cy < FONT_HEIGHT; ++cy) {
for (uint32_t cx = 0; cx < FONT_WIDTH; ++cx) {
idx = fbdev_get_index(&scr->fbdev, (scr->curs_col * FONT_WIDTH) + cx, (scr->curs_row * FONT_HEIGHT) + cy);
@@ -141,6 +144,20 @@ cons_handle_special(struct cons_screen *scr, char c)
return -1;
}
+/*
+ * Character device function.
+ */
+static int
+dev_write(dev_t dev, struct sio_txn *sio, int flags)
+{
+ char *p = sio->buf;
+
+ for (size_t i = 0; i < sio->len; ++i) {
+ cons_putch(&g_root_scr, p[i]);
+ }
+
+ return sio->len;
+}
/*
* Put a character on the screen.
@@ -204,3 +221,32 @@ cons_init(void)
g_root_scr.ncols = fbdev.width / FONT_WIDTH;
g_root_scr.fbdev = fbdev;
}
+
+/*
+ * Expose the console to /dev/console
+ */
+void
+cons_expose(void)
+{
+ static int once = 0;
+ char devname[] = "console";
+ devmajor_t major;
+ dev_t dev;
+
+ /* Only run once */
+ if (once) {
+ return;
+ }
+
+ /* Register the device here */
+ major = dev_alloc_major();
+ dev = dev_alloc(major);
+ dev_register(major, dev, &cons_cdevsw);
+ devfs_create_entry(devname, major, dev, 0444);
+ once ^= 1;
+}
+
+static struct cdevsw cons_cdevsw = {
+ .read = noread,
+ .write = dev_write
+};
diff --git a/sys/include/dev/cons/cons.h b/sys/include/dev/cons/cons.h
index fe7eb6d..3415617 100644
--- a/sys/include/dev/cons/cons.h
+++ b/sys/include/dev/cons/cons.h
@@ -56,6 +56,7 @@ struct cons_screen {
};
void cons_init(void);
+void cons_expose(void);
int cons_putch(struct cons_screen *scr, char c);
extern struct cons_screen g_root_scr;
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index 1fb3418..f3f88d7 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -83,6 +83,9 @@ main(void)
DRIVERS_INIT();
+ /* Expose the console to devfs */
+ cons_expose();
+
/* Start scheduler and bootstrap APs */
sched_init();
mp_bootstrap_aps(&g_bsp_ci);