aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorBruce Evans <bde@FreeBSD.org>2017-03-04 06:19:12 +0000
committerBruce Evans <bde@FreeBSD.org>2017-03-04 06:19:12 +0000
commit0a743c09574de0e3f98556f95a5c18e3fcdee05a (patch)
treeac1f73e74765b93800dfa6d32150442b9e19af00 /sys
parente245deadcb36a1173dfac9f219812894cd11ef6c (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/syscons/scterm-teken.c2
-rw-r--r--sys/dev/syscons/syscons.c21
-rw-r--r--sys/dev/syscons/syscons.h1
3 files changed, 22 insertions, 2 deletions
diff --git a/sys/dev/syscons/scterm-teken.c b/sys/dev/syscons/scterm-teken.c
index 43f16faff9829..7d4f1c81066b4 100644
--- a/sys/dev/syscons/scterm-teken.c
+++ b/sys/dev/syscons/scterm-teken.c
@@ -176,7 +176,7 @@ scteken_puts(scr_stat *scp, u_char *buf, int len, int kernel)
if (kernel) {
/* Use special colors for kernel messages. */
backup = *teken_get_curattr(&ts->ts_teken);
- scteken_revattr(SC_KERNEL_CONS_ATTR, &kattr);
+ scteken_revattr(sc_kattr(), &kattr);
teken_set_curattr(&ts->ts_teken, &kattr);
teken_input(&ts->ts_teken, buf, len);
teken_set_curattr(&ts->ts_teken, &backup);
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index 5bbfebc52f20e..15873627f07b1 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
+#include <sys/pcpu.h>
#include <sys/priv.h>
#include <sys/proc.h>
#include <sys/random.h>
@@ -100,6 +101,8 @@ static default_attr user_default = {
SC_NORM_REV_ATTR,
};
+static u_char sc_kattrtab[MAXCPU];
+
static int sc_console_unit = -1;
static int sc_saver_keyb_only = 1;
static scr_stat *sc_console;
@@ -141,6 +144,8 @@ static int sc_no_suspend_vtswitch = 0;
static int sc_susp_scr;
static SYSCTL_NODE(_hw, OID_AUTO, syscons, CTLFLAG_RD, 0, "syscons");
+SYSCTL_OPAQUE(_hw_syscons, OID_AUTO, kattr, CTLFLAG_RW,
+ &sc_kattrtab, sizeof(sc_kattrtab), "CU", "kernel console attributes");
static SYSCTL_NODE(_hw_syscons, OID_AUTO, saver, CTLFLAG_RD, 0, "saver");
SYSCTL_INT(_hw_syscons_saver, OID_AUTO, keybonly, CTLFLAG_RW,
&sc_saver_keyb_only, 0, "screen saver interrupted by input only");
@@ -2994,8 +2999,16 @@ scinit(int unit, int flags)
int i;
/* one time initialization */
- if (init_done == COLD)
+ if (init_done == COLD) {
sc_get_bios_values(&bios_value);
+ for (i = 0; i < nitems(sc_kattrtab); i++) {
+#if SC_KERNEL_CONS_ATTR == FG_WHITE
+ sc_kattrtab[i] = 8 + (i + FG_WHITE) % 8U;
+#else
+ sc_kattrtab[i] = SC_KERNEL_CONS_ATTR;
+#endif
+ }
+ }
init_done = WARM;
/*
@@ -4008,6 +4021,12 @@ sc_bell(scr_stat *scp, int pitch, int duration)
}
}
+int
+sc_kattr(void)
+{
+ return (sc_kattrtab[PCPU_GET(cpuid) % nitems(sc_kattrtab)]);
+}
+
static void
blink_screen(void *arg)
{
diff --git a/sys/dev/syscons/syscons.h b/sys/dev/syscons/syscons.h
index 24d386afc16bc..443792717ec03 100644
--- a/sys/dev/syscons/syscons.h
+++ b/sys/dev/syscons/syscons.h
@@ -581,6 +581,7 @@ void sc_paste(scr_stat *scp, const u_char *p, int count);
void sc_respond(scr_stat *scp, const u_char *p,
int count, int wakeup);
void sc_bell(scr_stat *scp, int pitch, int duration);
+int sc_kattr(void);
/* schistory.c */
#ifndef SC_NO_HISTORY