summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-07-01 21:21:42 -0400
committerIan Moffett <ian@osmora.org>2025-07-01 21:21:42 -0400
commit43ab8b32a142bfcbb5f2896f6989434507079ca1 (patch)
tree8eb473421e86cbf5bacc0961ef6b7b6b250af7fe
parent380d1a07c59929b664ddc541055d8014fea9f1c8 (diff)
kernel: console: Introduce /ctl/console/featmain
Introduce a ctlfs entry for configuring various console features such as the ability to parse ANSI escape codes. Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r--sys/dev/cons/cons.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/sys/dev/cons/cons.c b/sys/dev/cons/cons.c
index 3eb7c33..34067da 100644
--- a/sys/dev/cons/cons.c
+++ b/sys/dev/cons/cons.c
@@ -37,6 +37,7 @@
#include <dev/cons/font.h>
#include <dev/cons/cons.h>
#include <fs/devfs.h>
+#include <fs/ctlfs.h>
#include <vm/dynalloc.h>
#include <string.h>
@@ -62,6 +63,7 @@
struct cons_screen g_root_scr = {0};
static struct cdevsw cons_cdevsw;
+static struct ctlops cons_feat_ctl;
static void cons_draw_cursor(struct cons_screen *scr, uint32_t color);
static int cons_handle_special(struct cons_screen *scr, char c);
@@ -412,6 +414,40 @@ cons_init_bufs(struct cons_screen *scr)
return 0;
}
+static int
+ctl_feat_read(struct ctlfs_dev *cdp, struct sio_txn *sio)
+{
+ struct cons_screen *scr = &g_root_scr;
+ struct console_feat *featp;
+
+ if (sio->buf == NULL || sio->len == 0) {
+ return -EINVAL;
+ }
+
+ featp = &scr->feat;
+ if (sio->len > sizeof(*featp)) {
+ sio->len = sizeof(*featp);
+ }
+
+ memcpy(sio->buf, featp, sio->len);
+ return sio->len;
+}
+
+static int
+ctl_feat_write(struct ctlfs_dev *cdp, struct sio_txn *sio)
+{
+ struct cons_screen *scr = &g_root_scr;
+ struct console_feat *featp;
+
+ featp = &scr->feat;
+ if (sio->len > sizeof(*featp)) {
+ sio->len = sizeof(*featp);
+ }
+
+ memcpy(featp, sio->buf, sio->len);
+ return sio->len;
+}
+
/*
* Reset console color.
*/
@@ -512,6 +548,7 @@ void
cons_expose(void)
{
static int once = 0;
+ struct ctlfs_dev ctl;
char devname[] = "console";
devmajor_t major;
dev_t dev;
@@ -526,6 +563,14 @@ cons_expose(void)
dev = dev_alloc(major);
dev_register(major, dev, &cons_cdevsw);
devfs_create_entry(devname, major, dev, 0444);
+
+
+ /* Register the control file */
+ ctl.mode = 0666;
+ ctlfs_create_node(devname, &ctl);
+ ctl.devname = devname;
+ ctl.ops = &cons_feat_ctl;
+ ctlfs_create_entry("feat", &ctl);
once ^= 1;
}
@@ -533,3 +578,8 @@ static struct cdevsw cons_cdevsw = {
.read = dev_read,
.write = dev_write
};
+
+static struct ctlops cons_feat_ctl = {
+ .read = ctl_feat_read,
+ .write = ctl_feat_write
+};