Index: sys/dev/wscons/wsdisplay_vcons.c =================================================================== RCS file: /cvsroot/src/sys/dev/wscons/wsdisplay_vcons.c,v retrieving revision 1.68 diff -p -u -r1.68 wsdisplay_vcons.c --- sys/dev/wscons/wsdisplay_vcons.c 9 Feb 2024 22:08:37 -0000 1.68 +++ sys/dev/wscons/wsdisplay_vcons.c 21 Apr 2024 10:07:42 -0000 @@ -215,7 +215,7 @@ vcons_init_common(struct vcons_data *vd, vdp->wanted = NULL; vdp->currenttype = def; vdp->defaulttype = def; - callout_init(&vdp->switch_callout, 0); + callout_init(&vdp->switch_callout, CALLOUT_MPSAFE); callout_setfunc(&vdp->switch_callout, vcons_do_switch, vd); #ifdef VCONS_DRAW_INTR vdp->cells = 0; @@ -234,7 +234,8 @@ vcons_init_common(struct vcons_data *vd, #endif #ifdef VCONS_DRAW_INTR if (enable_intr) { - vdp->intr_softint = softint_establish(SOFTINT_SERIAL, + vdp->intr_softint = softint_establish( + SOFTINT_SERIAL | SOFTINT_MPSAFE, vcons_softintr, vd); callout_init(&vdp->intr, CALLOUT_MPSAFE); callout_setfunc(&vdp->intr, vcons_intr, vd); @@ -753,8 +754,8 @@ void vcons_update_screen(struct vcons_screen *scr) { #ifdef VCONS_DRAW_INTR - uint32_t *charptr = scr->scr_chars; - long *attrptr = scr->scr_attrs; + uint32_t *charptr = scr->scr_chars, c; + long *attrptr = scr->scr_attrs, a; struct rasops_info *ri = &scr->scr_ri; struct vcons_data *vd = scr->scr_vd; struct vcons_data_private *vdp = vd->private; @@ -786,12 +787,14 @@ vcons_update_screen(struct vcons_screen * and we already made sure the screen we're * working on is visible */ - if ((vdp->chars[boffset] != charptr[offset]) || - (vdp->attrs[boffset] != attrptr[offset])) { - scr->putchar(ri, i, j, - charptr[offset], attrptr[offset]); - vdp->chars[boffset] = charptr[offset]; - vdp->attrs[boffset] = attrptr[offset]; + c = charptr[offset]; + a = attrptr[offset]; + + if ((vdp->chars[boffset] != c) || + (vdp->attrs[boffset] != a)) { + scr->putchar(ri, i, j, c, a); + vdp->chars[boffset] = c; + vdp->attrs[boffset] = a; } offset++; boffset++;