Module Name:    src
Committed By:   jmcneill
Date:           Wed Jan 30 11:24:48 UTC 2019

Modified Files:
        src/sys/dev/wscons: wsdisplay.c wsdisplay_vcons_util.c wsdisplayvar.h

Log Message:
Suspend multicons output to the old console device while replaying
the vcons msgbuf.


To generate a diff of this commit:
cvs rdiff -u -r1.151 -r1.152 src/sys/dev/wscons/wsdisplay.c
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/wscons/wsdisplay_vcons_util.c
cvs rdiff -u -r1.54 -r1.55 src/sys/dev/wscons/wsdisplayvar.h

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.151 src/sys/dev/wscons/wsdisplay.c:1.152
--- src/sys/dev/wscons/wsdisplay.c:1.151	Wed Jan 30 10:54:52 2019
+++ src/sys/dev/wscons/wsdisplay.c	Wed Jan 30 11:24:48 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: wsdisplay.c,v 1.151 2019/01/30 10:54:52 jmcneill Exp $ */
+/* $NetBSD: wsdisplay.c,v 1.152 2019/01/30 11:24:48 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.151 2019/01/30 10:54:52 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wsdisplay.c,v 1.152 2019/01/30 11:24:48 jmcneill Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_wsdisplay_compat.h"
@@ -74,6 +74,7 @@ __KERNEL_RCSID(0, "$NetBSD: wsdisplay.c,
 
 #ifdef WSDISPLAY_MULTICONS
 static bool wsdisplay_multicons_enable = true;
+static bool wsdisplay_multicons_suspended = false;
 #endif
 
 /* Console device before replaced by wsdisplay */
@@ -2301,7 +2302,8 @@ wsdisplay_cnputc(dev_t dev, int i)
 	(*dc->wsemul->output)(dc->wsemulcookie, &c, 1, 1);
 
 #ifdef WSDISPLAY_MULTICONS
-	if (wsdisplay_multicons_enable && wsdisplay_ocn && wsdisplay_ocn->cn_putc)
+	if (!wsdisplay_multicons_suspended &&
+	    wsdisplay_multicons_enable && wsdisplay_ocn && wsdisplay_ocn->cn_putc)
 		wsdisplay_ocn->cn_putc(wsdisplay_ocn->cn_dev, i);
 #endif
 }
@@ -2318,7 +2320,8 @@ wsdisplay_getc(dev_t dev)
 	}
 
 #ifdef WSDISPLAY_MULTICONS
-	if (wsdisplay_multicons_enable && wsdisplay_ocn && wsdisplay_ocn->cn_getc) {
+	if (!wsdisplay_multicons_suspended &&
+	    wsdisplay_multicons_enable && wsdisplay_ocn && wsdisplay_ocn->cn_getc) {
 		c = wsdisplay_ocn->cn_getc(wsdisplay_ocn->cn_dev);
 		if (c >= 0)
 			return c;
@@ -2345,7 +2348,8 @@ wsdisplay_pollc(dev_t dev, int on)
 
 #ifdef WSDISPLAY_MULTICONS
 	/* notify to old console driver */
-	if (wsdisplay_multicons_enable && wsdisplay_ocn && wsdisplay_ocn->cn_pollc)
+	if (!wsdisplay_multicons_suspended &&
+	    wsdisplay_multicons_enable && wsdisplay_ocn && wsdisplay_ocn->cn_pollc)
 		wsdisplay_ocn->cn_pollc(wsdisplay_ocn->cn_dev, on);
 #endif
 }
@@ -2368,6 +2372,14 @@ wsdisplay_unset_cons_kbd(void)
 }
 
 #ifdef WSDISPLAY_MULTICONS
+void
+wsdisplay_multicons_suspend(bool suspend)
+{
+	wsdisplay_multicons_suspended = suspend;
+}
+#endif
+
+#ifdef WSDISPLAY_MULTICONS
 SYSCTL_SETUP(sysctl_hw_wsdisplay_setup, "sysctl hw.wsdisplay subtree setup")
 {
 	const struct sysctlnode *wsdisplay_node;

Index: src/sys/dev/wscons/wsdisplay_vcons_util.c
diff -u src/sys/dev/wscons/wsdisplay_vcons_util.c:1.2 src/sys/dev/wscons/wsdisplay_vcons_util.c:1.3
--- src/sys/dev/wscons/wsdisplay_vcons_util.c:1.2	Wed May 25 06:01:39 2011
+++ src/sys/dev/wscons/wsdisplay_vcons_util.c	Wed Jan 30 11:24:48 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: wsdisplay_vcons_util.c,v 1.2 2011/05/25 06:01:39 macallan Exp $ */
+/*	$NetBSD: wsdisplay_vcons_util.c,v 1.3 2019/01/30 11:24:48 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2009 Michael Lorenz
@@ -26,6 +26,10 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#ifdef _KERNEL_OPT
+#include "opt_wsdisplay_compat.h"
+#endif
+
 /* some utility functions for use with vcons */
 #include <sys/param.h>
 #include <sys/stdint.h>
@@ -48,6 +52,10 @@ vcons_replay_msgbuf(struct vcons_screen 
 	int status = scr->scr_status;
 	int rptr = msgbufp->msg_bufr;
 
+#ifdef WSDISPLAY_MULTICONS
+	wsdisplay_multicons_suspend(true);
+#endif
+
 	scr->scr_status &= ~VCONS_IS_VISIBLE;
 	while (rptr != msgbufp->msg_bufx) {
 		cnputc(msgbufp->msg_bufc[rptr]);
@@ -57,4 +65,8 @@ vcons_replay_msgbuf(struct vcons_screen 
 	}
 	scr->scr_status = status;
 	vcons_update_screen(scr);
+
+#ifdef WSDISPLAY_MULTICONS
+	wsdisplay_multicons_suspend(false);
+#endif
 }

Index: src/sys/dev/wscons/wsdisplayvar.h
diff -u src/sys/dev/wscons/wsdisplayvar.h:1.54 src/sys/dev/wscons/wsdisplayvar.h:1.55
--- src/sys/dev/wscons/wsdisplayvar.h:1.54	Tue Dec  4 09:27:59 2018
+++ src/sys/dev/wscons/wsdisplayvar.h	Wed Jan 30 11:24:48 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: wsdisplayvar.h,v 1.54 2018/12/04 09:27:59 mlelstv Exp $ */
+/* $NetBSD: wsdisplayvar.h,v 1.55 2019/01/30 11:24:48 jmcneill Exp $ */
 
 /*
  * Copyright (c) 1996, 1997 Christopher G. Demetriou.  All rights reserved.
@@ -173,6 +173,7 @@ void	wsdisplay_cnattach(const struct wss
 void	wsdisplay_preattach(const struct wsscreen_descr *, void *, int, int,
             long);
 void	wsdisplay_cndetach(void);
+void	wsdisplay_multicons_suspend(bool);
 
 int	wsdisplaydevprint(void *, const char *);
 int	wsemuldisplaydevprint(void *, const char *);

Reply via email to