[Midnightbsd-cvs] src: dev/syscons: sync with "enhanced" syscons
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Tue Dec 2 10:24:46 EST 2008
Log Message:
-----------
sync with "enhanced" syscons
Modified Files:
--------------
src/sys/dev/syscons:
scmouse.c (r1.2 -> r1.3)
scterm-sc.c (r1.2 -> r1.3)
syscons.c (r1.9 -> r1.10)
syscons.h (r1.2 -> r1.3)
-------------- next part --------------
Index: scterm-sc.c
===================================================================
RCS file: /home/cvs/src/sys/dev/syscons/scterm-sc.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -L sys/dev/syscons/scterm-sc.c -L sys/dev/syscons/scterm-sc.c -u -r1.2 -r1.3
--- sys/dev/syscons/scterm-sc.c
+++ sys/dev/syscons/scterm-sc.c
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/syscons/scterm-sc.c,v 1.21 2004/05/30 20:08:42 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/syscons/scterm-sc.c,v 1.23 2006/05/12 05:04:43 jhb Exp $");
#include "opt_syscons.h"
@@ -36,7 +36,7 @@
#include <sys/module.h>
#include <sys/consio.h>
-#if __sparc64__ || __powerpc__
+#if defined(__sparc64__) || defined(__powerpc__)
#include <machine/sc_machdep.h>
#else
#include <machine/pc/display.h>
@@ -228,7 +228,7 @@
sc_term_up_scroll(scp, 1, sc->scr_map[0x20],
tcp->cur_attr, 0, 0);
break;
-#if notyet
+#ifdef notyet
case 'Q':
tcp->esc = 4;
return;
@@ -653,7 +653,7 @@
splx(i);
break;
}
-#if notyet
+#ifdef notyet
} else if (tcp->esc == 4) { /* seen ESC Q */
/* to be filled */
#endif
Index: scmouse.c
===================================================================
RCS file: /home/cvs/src/sys/dev/syscons/scmouse.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -L sys/dev/syscons/scmouse.c -L sys/dev/syscons/scmouse.c -u -r1.2 -r1.3
--- sys/dev/syscons/scmouse.c
+++ sys/dev/syscons/scmouse.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/syscons/scmouse.c,v 1.37.2.3 2005/10/05 21:48:02 marius Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/syscons/scmouse.c,v 1.42 2007/05/25 13:13:12 delphij Exp $");
#include "opt_syscons.h"
@@ -444,7 +444,8 @@
if (scp->status & MOUSE_VISIBLE) {
sc_remove_all_cutmarkings(scp->sc);
- if (scp->mouse_pos == scp->mouse_cut_start == scp->mouse_cut_end) {
+ if ((scp->mouse_pos == scp->mouse_cut_start) &&
+ (scp->mouse_pos == scp->mouse_cut_end)) {
cut_buffer[0] = '\0';
return;
} else if (skip_spc_right(scp, scp->mouse_pos) >= scp->xsize) {
Index: syscons.h
===================================================================
RCS file: /home/cvs/src/sys/dev/syscons/syscons.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -L sys/dev/syscons/syscons.h -L sys/dev/syscons/syscons.h -u -r1.2 -r1.3
--- sys/dev/syscons/syscons.h
+++ sys/dev/syscons/syscons.h
@@ -28,7 +28,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/dev/syscons/syscons.h,v 1.83.2.2 2005/10/05 21:48:02 marius Exp $
+ * $FreeBSD: src/sys/dev/syscons/syscons.h,v 1.88 2007/09/20 04:05:59 simokawa Exp $
*/
#ifndef _DEV_SYSCONS_SYSCONS_H_
@@ -333,6 +333,7 @@
int splash_save_mode; /* saved mode for splash screen */
int splash_save_status; /* saved status for splash screen */
+ struct mtx scr_lock; /* mutex for sc_puts() */
#ifdef _SCR_MD_STAT_DECLARED_
scr_md_stat_t md; /* machine dependent vars */
#endif
@@ -536,19 +537,17 @@
(*kbdsw[(kbd)->kb_index]->poll)((kbd), (on))
#define SC_VIDEO_LOCKINIT(sc) \
- mtx_init(&(sc)->video_mtx, "syscons video lock", NULL, MTX_SPIN);
-
+ mtx_init(&(sc)->video_mtx, "syscons video lock", NULL,MTX_SPIN);
#define SC_VIDEO_LOCK(sc) \
- do { \
- if (!cold) \
- mtx_lock_spin(&(sc)->video_mtx); \
- } while (0)
-
+ do { \
+ if (!cold) \
+ mtx_lock_spin(&(sc)->video_mtx); \
+ } while(0)
#define SC_VIDEO_UNLOCK(sc) \
- do { \
- if (!cold) \
- mtx_unlock_spin(&(sc)->video_mtx); \
- } while(0)
+ do { \
+ if (!cold) \
+ mtx_unlock_spin(&(sc)->video_mtx); \
+ } while(0)
/* syscons.c */
extern int (*sc_user_ioctl)(struct cdev *dev, u_long cmd, caddr_t data,
Index: syscons.c
===================================================================
RCS file: /home/cvs/src/sys/dev/syscons/syscons.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -L sys/dev/syscons/syscons.c -L sys/dev/syscons/syscons.c -u -r1.9 -r1.10
--- sys/dev/syscons/syscons.c
+++ sys/dev/syscons/syscons.c
@@ -30,8 +30,9 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/dev/syscons/syscons.c,v 1.436.2.5 2006/03/04 00:41:28 emax Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/syscons/syscons.c,v 1.453.4.1 2008/01/28 12:49:33 kib Exp $");
+#include "opt_compat.h"
#include "opt_syscons.h"
#include "opt_splash.h"
#include "opt_ddb.h"
@@ -49,6 +50,7 @@
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
+#include <sys/priv.h>
#include <sys/proc.h>
#include <sys/random.h>
#include <sys/reboot.h>
@@ -217,16 +219,13 @@
static int update_kbd_leds(scr_stat *scp, int which);
static timeout_t blink_screen;
-static cn_probe_t sccnprobe;
-static cn_init_t sccninit;
-static cn_getc_t sccngetc;
-static cn_checkc_t sccncheckc;
-static cn_putc_t sccnputc;
-static cn_dbctl_t sccndbctl;
-static cn_term_t sccnterm;
+static cn_probe_t sc_cnprobe;
+static cn_init_t sc_cninit;
+static cn_term_t sc_cnterm;
+static cn_getc_t sc_cngetc;
+static cn_putc_t sc_cnputc;
-CONS_DRIVER(sc, sccnprobe, sccninit, sccnterm, sccngetc, sccncheckc, sccnputc,
- sccndbctl);
+CONSOLE_DRIVER(sc);
static d_open_t scopen;
static d_close_t scclose;
@@ -519,7 +518,7 @@
ttyld_modem(tp, 1);
}
else
- if (tp->t_state & TS_XCLUDE && suser(td))
+ if (tp->t_state & TS_XCLUDE && priv_check(td, PRIV_TTY_EXCLUSIVE))
return(EBUSY);
error = ttyld_open(tp, dev);
@@ -683,6 +682,10 @@
sc_softc_t *sc;
scr_stat *scp;
int s;
+#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
+ defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
+ int ival;
+#endif
tp = dev->si_tty;
@@ -766,11 +769,11 @@
return 0;
case CONS_BELLTYPE: /* set bell type sound/visual */
- if ((*(int *)data) & 0x01)
+ if ((*(int *)data) & CONS_VISUAL_BELL)
sc->flags |= SC_VISUAL_BELL;
else
sc->flags &= ~SC_VISUAL_BELL;
- if ((*(int *)data) & 0x02)
+ if ((*(int *)data) & CONS_QUIET_BELL)
sc->flags |= SC_QUIET_BELL;
else
sc->flags &= ~SC_QUIET_BELL;
@@ -983,6 +986,13 @@
bcopy(&scp->smode, data, sizeof(struct vt_mode));
return 0;
+#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
+ defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
+ case _IO('v', 4):
+ ival = IOCPARM_IVAL(data);
+ data = (caddr_t)&ival;
+ /* FALLTHROUGH */
+#endif
case VT_RELDISP: /* screen switcher ioctl */
s = spltty();
/*
@@ -999,7 +1009,7 @@
return EPERM;
}
error = EINVAL;
- switch(*(intptr_t *)data) {
+ switch(*(int *)data) {
case VT_FALSE: /* user refuses to release screen, abort */
if ((error = finish_vt_rel(scp, FALSE, &s)) == 0)
DPRINTF(5, ("%s%d: VT_FALSE\n", SC_DRIVER_NAME, sc->unit));
@@ -1028,17 +1038,31 @@
}
return EINVAL;
+#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
+ defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
+ case _IO('v', 5):
+ ival = IOCPARM_IVAL(data);
+ data = (caddr_t)&ival;
+ /* FALLTHROUGH */
+#endif
case VT_ACTIVATE: /* switch to screen *data */
- i = (*(intptr_t *)data == 0) ? scp->index : (*(intptr_t *)data - 1);
+ i = (*(int *)data == 0) ? scp->index : (*(int *)data - 1);
s = spltty();
error = sc_clean_up(sc->cur_scp);
splx(s);
if (error)
- return error;
+ return error;
return sc_switch_scr(sc, i);
+#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
+ defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
+ case _IO('v', 6):
+ ival = IOCPARM_IVAL(data);
+ data = (caddr_t)&ival;
+ /* FALLTHROUGH */
+#endif
case VT_WAITACTIVE: /* wait for switch to occur */
- i = (*(intptr_t *)data == 0) ? scp->index : (*(intptr_t *)data - 1);
+ i = (*(int *)data == 0) ? scp->index : (*(int *)data - 1);
if ((i < sc->first_vty) || (i >= sc->first_vty + sc->vtys))
return EINVAL;
s = spltty();
@@ -1047,10 +1071,11 @@
if (error)
return error;
scp = sc_get_stat(SC_DEV(sc, i));
+ if (scp == NULL)
+ return (ENXIO);
if (scp == scp->sc->cur_scp)
return 0;
- while ((error=tsleep(&scp->smode, PZERO|PCATCH,
- "waitvt", 0)) == ERESTART) ;
+ error = tsleep(&scp->smode, PZERO | PCATCH, "waitvt", 0);
return error;
case VT_GETACTIVE: /* get active vty # */
@@ -1069,7 +1094,7 @@
return 0;
case KDENABIO: /* allow io operations */
- error = suser(td);
+ error = priv_check(td, PRIV_IO);
if (error != 0)
return error;
error = securelevel_gt(td->td_ucred, 0);
@@ -1090,6 +1115,13 @@
#endif
return 0;
+#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
+ defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
+ case _IO('K', 20):
+ ival = IOCPARM_IVAL(data);
+ data = (caddr_t)&ival;
+ /* FALLTHROUGH */
+#endif
case KDSKBSTATE: /* set keyboard state (locks) */
if (*(int *)data & ~LOCK_MASK)
return EINVAL;
@@ -1112,14 +1144,28 @@
error = ENODEV;
return error;
+#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
+ defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
+ case _IO('K', 67):
+ ival = IOCPARM_IVAL(data);
+ data = (caddr_t)&ival;
+ /* FALLTHROUGH */
+#endif
case KDSETRAD: /* set keyboard repeat & delay rates (old) */
if (*(int *)data & ~0x7f)
return EINVAL;
- error = kbd_ioctl(sc->kbd, cmd, data);
+ error = kbd_ioctl(sc->kbd, KDSETRAD, data);
if (error == ENOIOCTL)
error = ENODEV;
return error;
+#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
+ defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
+ case _IO('K', 7):
+ ival = IOCPARM_IVAL(data);
+ data = (caddr_t)&ival;
+ /* FALLTHROUGH */
+#endif
case KDSKBMODE: /* set keyboard mode */
switch (*(int *)data) {
case K_XLATE: /* switch to XLT ascii mode */
@@ -1127,7 +1173,7 @@
case K_CODE: /* switch to CODE mode */
scp->kbd_mode = *(int *)data;
if (scp == sc->cur_scp)
- kbd_ioctl(sc->kbd, cmd, data);
+ kbd_ioctl(sc->kbd, KDSKBMODE, data);
return 0;
default:
return EINVAL;
@@ -1144,6 +1190,13 @@
error = ENODEV;
return error;
+#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
+ defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
+ case _IO('K', 8):
+ ival = IOCPARM_IVAL(data);
+ data = (caddr_t)&ival;
+ /* FALLTHROUGH */
+#endif
case KDMKTONE: /* sound the bell */
if (*(int*)data)
sc_bell(scp, (*(int*)data)&0xffff,
@@ -1152,6 +1205,13 @@
sc_bell(scp, scp->bell_pitch, scp->bell_duration);
return 0;
+#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
+ defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
+ case _IO('K', 63):
+ ival = IOCPARM_IVAL(data);
+ data = (caddr_t)&ival;
+ /* FALLTHROUGH */
+#endif
case KIOCSOUND: /* make tone (*data) hz */
if (scp == sc->cur_scp) {
if (*(int *)data)
@@ -1169,6 +1229,13 @@
}
return 0;
+#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
+ defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
+ case _IO('K', 66):
+ ival = IOCPARM_IVAL(data);
+ data = (caddr_t)&ival;
+ /* FALLTHROUGH */
+#endif
case KDSETLED: /* set keyboard LED status */
if (*(int *)data & ~LED_MASK) /* FIXME: LOCK_MASK? */
return EINVAL;
@@ -1191,12 +1258,19 @@
error = ENODEV;
return error;
+#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
+ defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
+ case _IO('c', 110):
+ ival = IOCPARM_IVAL(data);
+ data = (caddr_t)&ival;
+ /* FALLTHROUGH */
+#endif
case CONS_SETKBD: /* set the new keyboard */
{
keyboard_t *newkbd;
s = spltty();
- newkbd = kbd_get_keyboard((int)*(intptr_t *)data);
+ newkbd = kbd_get_keyboard(*(int *)data);
if (newkbd == NULL) {
splx(s);
return EINVAL;
@@ -1405,7 +1479,7 @@
}
static void
-sccnprobe(struct consdev *cp)
+sc_cnprobe(struct consdev *cp)
{
int unit;
int flags;
@@ -1427,7 +1501,7 @@
}
static void
-sccninit(struct consdev *cp)
+sc_cninit(struct consdev *cp)
{
int unit;
int flags;
@@ -1440,7 +1514,7 @@
}
static void
-sccnterm(struct consdev *cp)
+sc_cnterm(struct consdev *cp)
{
/* we are not the kernel console any more, release everything */
@@ -1458,7 +1532,7 @@
}
static void
-sccnputc(struct consdev *cd, int c)
+sc_cnputc(struct consdev *cd, int c)
{
u_char buf[1];
scr_stat *scp = sc_console;
@@ -1500,48 +1574,11 @@
}
static int
-sccngetc(struct consdev *cd)
-{
- return sccngetch(0);
-}
-
-static int
-sccncheckc(struct consdev *cd)
+sc_cngetc(struct consdev *cd)
{
return sccngetch(SCGETC_NONBLOCK);
}
-static void
-sccndbctl(struct consdev *cd, int on)
-{
- /* assert(sc_console_unit >= 0) */
- /* try to switch to the kernel console screen */
- if (on && debugger == 0) {
- /*
- * TRY to make sure the screen saver is stopped,
- * and the screen is updated before switching to
- * the vty0.
- */
- scrn_timer(NULL);
- if (!cold
- && sc_console->sc->cur_scp->smode.mode == VT_AUTO
- && sc_console->smode.mode == VT_AUTO) {
- sc_console->sc->cur_scp->status |= MOUSE_HIDDEN;
- ++debugger; /* XXX */
-#ifdef DDB
- /* unlock vty switching */
- sc_console->sc->flags &= ~SC_SCRN_VTYLOCK;
-#endif
- sc_switch_scr(sc_console->sc, sc_console->index);
- --debugger; /* XXX */
- }
- }
- if (on)
- ++debugger;
- else
- --debugger;
-}
-
static int
sccngetch(int flags)
{
@@ -1618,7 +1655,7 @@
{
/* this is a cut-down version of scrn_timer()... */
- if (scp->sc->font_loading_in_progress)
+ if (scp->sc->font_loading_in_progress)
return;
if (debugger > 0 || panicstr || shutdown_in_progress) {
@@ -2141,7 +2178,7 @@
return 0;
}
sc->delayed_next_scr = 0;
-
+
s = spltty();
cur_scp = sc->cur_scp;
@@ -2290,8 +2327,8 @@
if (sc->new_scp == sc->old_scp) {
sc->switch_in_progress = 0;
/*
- * XXX wakeup() calls mtx_lock(&sched_lock) which will hang if
- * sched_lock is in an in-between state, e.g., when we stop at
+ * XXX wakeup() locks the scheduler lock which will hang if
+ * the lock is in an in-between state, e.g., when we stop at
* a breakpoint at fork_exit. It has always been wrong to call
* wakeup() when the debugger is active. In RELENG_4, wakeup()
* is supposed to be locked by splhigh(), but the debugger may
@@ -2475,14 +2512,23 @@
void
sc_puts(scr_stat *scp, u_char *buf, int len)
{
+ int need_unlock = 0;
+
#ifdef DEV_SPLASH
/* make screensaver happy */
if (!sticky_splash && scp == scp->sc->cur_scp && !sc_saver_keyb_only)
run_scrn_saver = FALSE;
#endif
- if (scp->tsw)
+ if (scp->tsw) {
+ if (!kdb_active && !mtx_owned(&scp->scr_lock)) {
+ need_unlock = 1;
+ mtx_lock_spin(&scp->scr_lock);
+ }
(*scp->tsw->te_puts)(scp, buf, len);
+ if (need_unlock)
+ mtx_unlock_spin(&scp->scr_lock);
+ }
if (scp->sc->delayed_next_scr)
sc_switch_scr(scp->sc, scp->sc->delayed_next_scr - 1);
@@ -2492,8 +2538,8 @@
sc_draw_cursor_image(scr_stat *scp)
{
/* assert(scp == scp->sc->cur_scp); */
- SC_VIDEO_LOCK(scp->sc);
- (*scp->rndr->draw_cursor)(scp, scp->cursor_pos,
+ SC_VIDEO_LOCK(scp->sc);
+ (*scp->rndr->draw_cursor)(scp, scp->cursor_pos,
scp->curs_attr.flags & CONS_BLINK_CURSOR, TRUE,
sc_inside_cutmark(scp, scp->cursor_pos));
scp->cursor_oldpos = scp->cursor_pos;
@@ -2648,6 +2694,7 @@
sc = sc_get_softc(unit, flags & SC_KERNEL_CONSOLE);
if ((sc->flags & SC_INIT_DONE) == 0)
SC_VIDEO_LOCKINIT(sc);
+
adp = NULL;
if (sc->adapter >= 0) {
vid_release(sc->adp, (void *)&sc->adapter);
@@ -2859,6 +2906,7 @@
(*scp->tsw->te_term)(scp, &scp->ts);
if (scp->ts != NULL)
free(scp->ts, M_DEVBUF);
+ mtx_destroy(&scp->scr_lock);
/* clear the structure */
if (!(flags & SC_KERNEL_CONSOLE)) {
@@ -3042,6 +3090,8 @@
scp->history = NULL;
scp->history_pos = 0;
scp->history_size = 0;
+
+ mtx_init(&scp->scr_lock, "scrlock", NULL, MTX_SPIN);
}
int
More information about the Midnightbsd-cvs
mailing list