summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/cons/cons.c139
-rw-r--r--sys/dev/dmi/dmi.c2
-rw-r--r--sys/dev/ic/ahci.c2
-rw-r--r--sys/dev/ic/nvme.c2
-rw-r--r--sys/dev/phy/e1000.c2
-rw-r--r--sys/dev/phy/rtl.c2
-rw-r--r--sys/dev/usb/xhci.c2
-rw-r--r--sys/dev/video/fbdev.c2
8 files changed, 146 insertions, 7 deletions
diff --git a/sys/dev/cons/cons.c b/sys/dev/cons/cons.c
index 3eb7c33..9921ff8 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);
@@ -233,8 +235,14 @@ cons_handle_special(struct cons_screen *scr, char c)
static void
cons_draw_cursor(struct cons_screen *scr, uint32_t color)
{
+ struct console_feat *featp;
size_t idx;
+ featp = &scr->feat;
+ if (!featp->show_curs) {
+ color = scr->bg;
+ }
+
/* Past screen width? */
if (scr->curs_col >= scr->ncols) {
scr->curs_col = 0;
@@ -335,6 +343,7 @@ cons_fast_putch(struct cons_screen *scr, char c)
static int
dev_write(dev_t dev, struct sio_txn *sio, int flags)
{
+ cons_attach();
cons_putstr(&g_root_scr, sio->buf, sio->len);
cons_flush(&g_root_scr);
return sio->len;
@@ -364,6 +373,7 @@ dev_read(dev_t dev, struct sio_txn *sio, int flags)
return -EAGAIN;
}
+ cons_attach();
spinlock_acquire(&g_root_scr.lock);
for (;;) {
/* Buffer too small */
@@ -412,6 +422,116 @@ 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, oldfeat;
+
+ featp = &scr->feat;
+ oldfeat = *featp;
+ if (sio->len > sizeof(*featp)) {
+ sio->len = sizeof(*featp);
+ }
+
+ memcpy(featp, sio->buf, sio->len);
+
+ /*
+ * If we are suddenly trying to reset the cursor
+ * status, redraw it.
+ */
+ if (featp->show_curs != oldfeat.show_curs) {
+ if (featp->show_curs == 0) {
+ HIDE_CURSOR(scr);
+ } else {
+ SHOW_CURSOR(scr);
+ }
+ }
+ return sio->len;
+}
+
+/*
+ * Detach the currently running process from the
+ * console.
+ */
+int
+cons_detach(void)
+{
+ struct cons_screen *scr;
+
+ scr = &g_root_scr;
+ if (scr->atproc == NULL) {
+ return 0;
+ }
+ if (scr->atproc_lock == NULL) {
+ return 0;
+ }
+
+ scr = &g_root_scr;
+ scr->atproc = NULL;
+ mutex_release(scr->atproc_lock);
+ return 0;
+}
+
+/*
+ * Attach the current process to the
+ * console.
+ */
+int
+cons_attach(void)
+{
+ struct cons_screen *scr;
+ struct proc *td, *atproc;
+
+ td = this_td();
+ if (td == NULL) {
+ return -1;
+ }
+
+ scr = &g_root_scr;
+ if (scr->atproc_lock == NULL) {
+ return 0;
+ }
+
+ scr = &g_root_scr;
+ atproc = scr->atproc;
+
+ if (atproc != NULL) {
+ if (atproc->pid == td->pid) {
+ return 0;
+ }
+
+ /*
+ * Do not release this here as we want
+ * any other process that tries to attach
+ * to wait.
+ */
+ mutex_acquire(scr->atproc_lock, 0);
+ }
+
+ scr->atproc = td;
+ return 0;
+}
+
/*
* Reset console color.
*/
@@ -492,6 +612,7 @@ cons_init(void)
featp = &g_root_scr.feat;
featp->ansi_esc = 1;
+ featp->show_curs = 1;
g_root_scr.ch_col = 0;
g_root_scr.ch_row = 0;
g_root_scr.fg = CONSOLE_FG;
@@ -500,6 +621,8 @@ cons_init(void)
g_root_scr.nrows = fbdev.height / FONT_HEIGHT;
g_root_scr.ncols = fbdev.width / FONT_WIDTH;
g_root_scr.fbdev = fbdev;
+ g_root_scr.atproc = NULL;
+ g_root_scr.atproc_lock = NULL;
memset(&g_root_scr.lock, 0, sizeof(g_root_scr.lock));
cons_init_bufs(&g_root_scr);
SHOW_CURSOR(&g_root_scr);
@@ -512,6 +635,7 @@ void
cons_expose(void)
{
static int once = 0;
+ struct ctlfs_dev ctl;
char devname[] = "console";
devmajor_t major;
dev_t dev;
@@ -521,11 +645,21 @@ cons_expose(void)
return;
}
+ /* Init the attached proc mutex lock */
+ g_root_scr.atproc_lock = mutex_new("console0");
+
/* 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);
+
+ /* 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 +667,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
+};
diff --git a/sys/dev/dmi/dmi.c b/sys/dev/dmi/dmi.c
index 8c7f21c..59946ad 100644
--- a/sys/dev/dmi/dmi.c
+++ b/sys/dev/dmi/dmi.c
@@ -248,4 +248,4 @@ dmi_init(void)
return 0;
}
-DRIVER_EXPORT(dmi_init);
+DRIVER_EXPORT(dmi_init, "dmi");
diff --git a/sys/dev/ic/ahci.c b/sys/dev/ic/ahci.c
index 5dbf4a7..d17c6a3 100644
--- a/sys/dev/ic/ahci.c
+++ b/sys/dev/ic/ahci.c
@@ -1040,4 +1040,4 @@ static struct bdevsw ahci_bdevsw = {
.bsize = ahci_dev_bsize
};
-DRIVER_DEFER(ahci_init);
+DRIVER_DEFER(ahci_init, "ahci");
diff --git a/sys/dev/ic/nvme.c b/sys/dev/ic/nvme.c
index 822b085..147ab4f 100644
--- a/sys/dev/ic/nvme.c
+++ b/sys/dev/ic/nvme.c
@@ -662,4 +662,4 @@ static struct bdevsw nvme_bdevsw = {
.write = nowrite
};
-DRIVER_DEFER(nvme_init);
+DRIVER_DEFER(nvme_init, "nvme");
diff --git a/sys/dev/phy/e1000.c b/sys/dev/phy/e1000.c
index 95efe6d..41a2a27 100644
--- a/sys/dev/phy/e1000.c
+++ b/sys/dev/phy/e1000.c
@@ -355,4 +355,4 @@ e1000_init(void)
return 0;
}
-DRIVER_EXPORT(e1000_init);
+DRIVER_EXPORT(e1000_init, "e1000");
diff --git a/sys/dev/phy/rtl.c b/sys/dev/phy/rtl.c
index 691f767..d096d1a 100644
--- a/sys/dev/phy/rtl.c
+++ b/sys/dev/phy/rtl.c
@@ -440,4 +440,4 @@ rt81xx_init(void)
return rt_init_mac();
}
-DRIVER_DEFER(rt81xx_init);
+DRIVER_DEFER(rt81xx_init, "rtl81xx");
diff --git a/sys/dev/usb/xhci.c b/sys/dev/usb/xhci.c
index 46ec4af..0ccb7a0 100644
--- a/sys/dev/usb/xhci.c
+++ b/sys/dev/usb/xhci.c
@@ -545,4 +545,4 @@ xhci_init(void)
return xhci_init_hc(&xhc);
}
-DRIVER_EXPORT(xhci_init);
+DRIVER_EXPORT(xhci_init, "xhci");
diff --git a/sys/dev/video/fbdev.c b/sys/dev/video/fbdev.c
index 8a2499d..6b1c6c8 100644
--- a/sys/dev/video/fbdev.c
+++ b/sys/dev/video/fbdev.c
@@ -135,4 +135,4 @@ static const struct ctlops fb_size_ctl = {
.write = NULL,
};
-DRIVER_EXPORT(fbdev_init);
+DRIVER_EXPORT(fbdev_init, "fbdev");