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