Module Name:    src
Committed By:   hans
Date:           Sun Mar  9 18:50:20 UTC 2025

Modified Files:
        src/sys/arch/vax/vsa: spx.c

Log Message:
vax/spx(4): fix a few X11-related bugs

- overwriting of saved screen pointer of emulation mode when switching
  the framebuffer mode from mapped to dumb or vice-versa
- leaving the cursor on when switching away from emulation mode
- failure to restore the screen when changing back to emulation mode
  because the saved screen pointer has been set to NULL
- panic on next VT switch, because now also the current screen pointer
  is NULL


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/vax/vsa/spx.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/vax/vsa/spx.c
diff -u src/sys/arch/vax/vsa/spx.c:1.12 src/sys/arch/vax/vsa/spx.c:1.13
--- src/sys/arch/vax/vsa/spx.c:1.12	Sat Aug  7 16:19:07 2021
+++ src/sys/arch/vax/vsa/spx.c	Sun Mar  9 18:50:20 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: spx.c,v 1.12 2021/08/07 16:19:07 thorpej Exp $ */
+/*	$NetBSD: spx.c,v 1.13 2025/03/09 18:50:20 hans Exp $ */
 /*
  * SPX/LCSPX/SPXg/SPXgt accelerated framebuffer driver for NetBSD/VAX
  * Copyright (c) 2005 Blaz Antonic
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: spx.c,v 1.12 2021/08/07 16:19:07 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spx.c,v 1.13 2025/03/09 18:50:20 hans Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -991,9 +991,14 @@ spx_ioctl(void *v, void *vs, u_long cmd,
 			if (savescr != NULL)
 				spx_show_screen(NULL, savescr, 0, NULL, NULL);
 			savescr = NULL;
-		} else {		/* WSDISPLAYIO_MODE_MAPPED */
-			savescr = curscr;
-			curscr = NULL;
+		} else { /* WSDISPLAYIO_MODE_{MAPPED,DUMBFB} */
+			if (curscr != NULL) {
+				savescr = curscr;
+				curscr = NULL;
+
+				/* disable cursor */
+				set_btreg(SPXDAC_REG_CCR, 0x01);
+			}
 			/* clear screen? */
 		}
 
@@ -1094,9 +1099,11 @@ spx_show_screen(void *v, void *cookie, i
 			c = ss->ss_image[idx].data;
 
 			/* check if cell requires updating */
-			if ((c != prevscr->ss_image[idx].data) ||
+			if (prevscr == NULL ||
+			    (c != prevscr->ss_image[idx].data) ||
 			    (attr != prevscr->ss_image[idx].attr)) {
-				if (c < 32) c = 32;
+				if (c < 32)
+					c = 32;
 				spx_putchar(ss, row, col, c, attr);
 			}
 		}

Reply via email to