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 *);