Module Name:    src
Committed By:   jmcneill
Date:           Thu Nov 29 23:18:40 UTC 2018

Modified Files:
        src/sys/dev/wscons: wsdisplay.c

Log Message:
Add hw.wsdisplay.multicons sysctl that can be used to disable mirroring 
wsdisplay output to serial port.


To generate a diff of this commit:
cvs rdiff -u -r1.148 -r1.149 src/sys/dev/wscons/wsdisplay.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/wscons/wsdisplay.c
diff -u src/sys/dev/wscons/wsdisplay.c:1.148 src/sys/dev/wscons/wsdisplay.c:1.149
--- src/sys/dev/wscons/wsdisplay.c:1.148	Thu Nov 15 13:50:51 2018
+++ src/sys/dev/wscons/wsdisplay.c	Thu Nov 29 23:18:40 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: wsdisplay.c,v 1.148 2018/11/15 13:50:51 jmcneill Exp $ */
+/* $NetBSD: wsdisplay.c,v 1.149 2018/11/29 23:18:40 jmcneill Exp $ */
 
 /*
  * Copyright (c) 1996, 1997 Christopher G. Demetriou.  All rights reserved.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wsdisplay.c,v 1.148 2018/11/15 13:50:51 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wsdisplay.c,v 1.149 2018/11/29 23:18:40 jmcneill Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_wsdisplay_compat.h"
@@ -58,6 +58,7 @@ __KERNEL_RCSID(0, "$NetBSD: wsdisplay.c,
 #include <sys/fcntl.h>
 #include <sys/vnode.h>
 #include <sys/kauth.h>
+#include <sys/sysctl.h>
 
 #include <dev/wscons/wsconsio.h>
 #include <dev/wscons/wseventvar.h>
@@ -71,6 +72,10 @@ __KERNEL_RCSID(0, "$NetBSD: wsdisplay.c,
 
 #include "locators.h"
 
+#ifdef WSDISPLAY_MULTICONS
+static bool wsdisplay_multicons_enable = true;
+#endif
+
 /* Console device before replaced by wsdisplay */
 static struct consdev *wsdisplay_ocn;
 
@@ -277,7 +282,8 @@ wsscreen_getc_poll(void *priv)
 	struct wsscreen *scr = priv;
 	int c;
 
-	if (wsdisplay_ocn && wsdisplay_ocn->cn_getc &&
+	if (wsdisplay_multicons_enable &&
+	    wsdisplay_ocn && wsdisplay_ocn->cn_getc &&
 	    WSSCREEN_HAS_EMULATOR(scr) && WSSCREEN_HAS_TTY(scr)) {
 		struct tty *tp = scr->scr_tty;
 		do {
@@ -1670,7 +1676,8 @@ wsdisplaystart(struct tty *tp)
 		(*scr->scr_dconf->wsemul->output)(scr->scr_dconf->wsemulcookie,
 						  tbuf, n, 0);
 #ifdef WSDISPLAY_MULTICONS
-		if (scr->scr_dconf == &wsdisplay_console_conf &&
+		if (wsdisplay_multicons_enable &&
+		    scr->scr_dconf == &wsdisplay_console_conf &&
 		    wsdisplay_ocn && wsdisplay_ocn->cn_putc) {
 			for (int i = 0; i < n; i++)
 				wsdisplay_ocn->cn_putc(
@@ -1689,7 +1696,8 @@ wsdisplaystart(struct tty *tp)
 			    (scr->scr_dconf->wsemulcookie, tbuf, n, 0);
 
 #ifdef WSDISPLAY_MULTICONS
-			if (scr->scr_dconf == &wsdisplay_console_conf &&
+			if (wsdisplay_multicons_enable &&
+			    scr->scr_dconf == &wsdisplay_console_conf &&
 			    wsdisplay_ocn && wsdisplay_ocn->cn_putc) {
 				for (int i = 0; i < n; i++)
 					wsdisplay_ocn->cn_putc(
@@ -2293,7 +2301,7 @@ wsdisplay_cnputc(dev_t dev, int i)
 	(*dc->wsemul->output)(dc->wsemulcookie, &c, 1, 1);
 
 #ifdef WSDISPLAY_MULTICONS
-	if (wsdisplay_ocn && wsdisplay_ocn->cn_putc)
+	if (wsdisplay_multicons_enable && wsdisplay_ocn && wsdisplay_ocn->cn_putc)
 		wsdisplay_ocn->cn_putc(wsdisplay_ocn->cn_dev, i);
 #endif
 }
@@ -2310,7 +2318,7 @@ wsdisplay_getc(dev_t dev)
 	}
 
 #ifdef WSDISPLAY_MULTICONS
-	if (wsdisplay_ocn && wsdisplay_ocn->cn_getc) {
+	if (wsdisplay_multicons_enable && wsdisplay_ocn && wsdisplay_ocn->cn_getc) {
 		c = wsdisplay_ocn->cn_getc(wsdisplay_ocn->cn_dev);
 		if (c >= 0)
 			return c;
@@ -2337,7 +2345,7 @@ wsdisplay_pollc(dev_t dev, int on)
 
 #ifdef WSDISPLAY_MULTICONS
 	/* notify to old console driver */
-	if (wsdisplay_ocn && wsdisplay_ocn->cn_pollc)
+	if (wsdisplay_multicons_enable && wsdisplay_ocn && wsdisplay_ocn->cn_pollc)
 		wsdisplay_ocn->cn_pollc(wsdisplay_ocn->cn_dev, on);
 #endif
 }
@@ -2358,3 +2366,24 @@ wsdisplay_unset_cons_kbd(void)
 	wsdisplay_cons_kbd_getc = NULL;
 	wsdisplay_cons_kbd_pollc = NULL;
 }
+
+#ifdef WSDISPLAY_MULTICONS
+SYSCTL_SETUP(sysctl_hw_wsdisplay_setup, "sysctl hw.wsdisplay subtree setup")
+{
+	const struct sysctlnode *wsdisplay_node;
+
+	if (sysctl_createv(clog, 0, NULL, &wsdisplay_node,
+	    CTLFLAG_PERMANENT,
+	    CTLTYPE_NODE, "wsdisplay", NULL,
+	    NULL, 0, NULL, 0,
+	    CTL_HW, CTL_CREATE, CTL_EOL) != 0)
+		return;
+
+	sysctl_createv(clog, 0, NULL, NULL,
+	    CTLFLAG_READWRITE,
+	    CTLTYPE_BOOL, "multicons",
+	    SYSCTL_DESCR("Enable wsdisplay multicons"),
+	    NULL, 0, &wsdisplay_multicons_enable, 0,
+	    CTL_HW, wsdisplay_node->sysctl_num, CTL_CREATE, CTL_EOL);
+}
+#endif

Reply via email to