Module Name:    src
Committed By:   rin
Date:           Sun Jul 28 12:06:11 UTC 2019

Modified Files:
        src/sys/dev/rasops: rasops.c rasops.h rasops15.c rasops2.c rasops24.c
            rasops32.c rasops4.c rasops8.c rasops_bitops.h rasops_putchar.h
            rasops_putchar_width.h

Log Message:
Cast attr to uint32_t before right shift to avoid undefined behavior.

Also, misc style/cosmetic changes for clarity.


To generate a diff of this commit:
cvs rdiff -u -r1.93 -r1.94 src/sys/dev/rasops/rasops.c
cvs rdiff -u -r1.36 -r1.37 src/sys/dev/rasops/rasops.h
cvs rdiff -u -r1.29 -r1.30 src/sys/dev/rasops/rasops15.c
cvs rdiff -u -r1.24 -r1.25 src/sys/dev/rasops/rasops2.c
cvs rdiff -u -r1.35 -r1.36 src/sys/dev/rasops/rasops24.c
cvs rdiff -u -r1.37 -r1.38 src/sys/dev/rasops/rasops32.c
cvs rdiff -u -r1.18 -r1.19 src/sys/dev/rasops/rasops4.c
cvs rdiff -u -r1.42 -r1.43 src/sys/dev/rasops/rasops8.c
cvs rdiff -u -r1.16 -r1.17 src/sys/dev/rasops/rasops_bitops.h
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/rasops/rasops_putchar.h
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/rasops/rasops_putchar_width.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/rasops/rasops.c
diff -u src/sys/dev/rasops/rasops.c:1.93 src/sys/dev/rasops/rasops.c:1.94
--- src/sys/dev/rasops/rasops.c:1.93	Sun Jul 28 10:24:08 2019
+++ src/sys/dev/rasops/rasops.c	Sun Jul 28 12:06:10 2019
@@ -1,4 +1,4 @@
-/*	 $NetBSD: rasops.c,v 1.93 2019/07/28 10:24:08 martin Exp $	*/
+/*	 $NetBSD: rasops.c,v 1.94 2019/07/28 12:06:10 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops.c,v 1.93 2019/07/28 10:24:08 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops.c,v 1.94 2019/07/28 12:06:10 rin Exp $");
 
 #include "opt_rasops.h"
 #include "rasops_glue.h"
@@ -232,7 +232,7 @@ int
 rasops_init(struct rasops_info *ri, int wantrows, int wantcols)
 {
 
-	memset (&ri->ri_optfont, 0, sizeof(ri->ri_optfont));
+	memset(&ri->ri_optfont, 0, sizeof(ri->ri_optfont));
 #ifdef _KERNEL
 	/* Select a font if the caller doesn't care */
 	if (ri->ri_font == NULL) {
@@ -952,7 +952,7 @@ rasops_eraserows(void *cookie, int row, 
 		return;
 #endif
 
-	clr = ri->ri_devcmap[(attr >> 16) & 0xf];
+	clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
 
 	/*
 	 * XXX The wsdisplay_emulops interface seems a little deficient in
@@ -1138,7 +1138,7 @@ rasops_erasecols(void *cookie, int row, 
 		hrp = (uint32_t *)(ri->ri_hwbits + row*ri->ri_yscale +
 		    col*ri->ri_xscale);
 	height = ri->ri_font->fontheight;
-	clr = ri->ri_devcmap[(attr >> 16) & 0xf];
+	clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
 
 	/* Don't bother using the full loop for <= 32 pels */
 	if (num <= 32) {
@@ -1357,7 +1357,7 @@ rasops_putchar_rotated_cw(void *cookie, 
 	/* XXX this assumes 16-bit color depth */
 	if ((attr & WSATTR_UNDERLINE) != 0) {
 		uint16_t c =
-		    (uint16_t)ri->ri_devcmap[((u_int)attr >> 24) & 0xf];
+		    (uint16_t)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
 
 		while (height--) {
 			*(uint16_t *)rp = c;
@@ -1480,7 +1480,7 @@ rasops_putchar_rotated_ccw(void *cookie,
 	/* XXX this assumes 16-bit color depth */
 	if ((attr & WSATTR_UNDERLINE) != 0) {
 		uint16_t c =
-		    (uint16_t)ri->ri_devcmap[((u_int)attr >> 24) & 0xf];
+		    (uint16_t)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
 
 		while (height--) {
 			*(uint16_t *)rp = c;

Index: src/sys/dev/rasops/rasops.h
diff -u src/sys/dev/rasops/rasops.h:1.36 src/sys/dev/rasops/rasops.h:1.37
--- src/sys/dev/rasops/rasops.h:1.36	Thu Jul 25 03:02:44 2019
+++ src/sys/dev/rasops/rasops.h	Sun Jul 28 12:06:10 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops.h,v 1.36 2019/07/25 03:02:44 rin Exp $ */
+/* 	$NetBSD: rasops.h,v 1.37 2019/07/28 12:06:10 rin Exp $ */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -139,7 +139,7 @@ struct rasops_info {
 #endif
 };
 
-#define DELTA(p, d, cast) ((p) = (cast)((char *)(p) + (d)))
+#define DELTA(p, d, cast) ((p) = (cast)((uint8_t *)(p) + (d)))
 
 #define CHAR_IN_FONT(c,font) 					\
        ((c) >= (font)->firstchar && 				\

Index: src/sys/dev/rasops/rasops15.c
diff -u src/sys/dev/rasops/rasops15.c:1.29 src/sys/dev/rasops/rasops15.c:1.30
--- src/sys/dev/rasops/rasops15.c:1.29	Sun Jul 28 02:45:52 2019
+++ src/sys/dev/rasops/rasops15.c	Sun Jul 28 12:06:10 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops15.c,v 1.29 2019/07/28 02:45:52 rin Exp $	*/
+/* 	$NetBSD: rasops15.c,v 1.30 2019/07/28 12:06:10 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops15.c,v 1.29 2019/07/28 02:45:52 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops15.c,v 1.30 2019/07/28 12:06:10 rin Exp $");
 
 #include "opt_rasops.h"
 
@@ -42,34 +42,31 @@ __KERNEL_RCSID(0, "$NetBSD: rasops15.c,v
 #include <dev/wscons/wsconsio.h>
 #include <dev/rasops/rasops.h>
 
-static void 	rasops15_putchar(void *, int, int, u_int, long attr);
-static void 	rasops15_putchar_aa(void *, int, int, u_int, long attr);
+static void 	rasops15_putchar(void *, int, int, u_int, long);
+static void 	rasops15_putchar_aa(void *, int, int, u_int, long);
 #ifndef RASOPS_SMALL
-static void 	rasops15_putchar8(void *, int, int, u_int, long attr);
-static void 	rasops15_putchar12(void *, int, int, u_int, long attr);
-static void 	rasops15_putchar16(void *, int, int, u_int, long attr);
+static void 	rasops15_putchar8(void *, int, int, u_int, long);
+static void 	rasops15_putchar12(void *, int, int, u_int, long);
+static void 	rasops15_putchar16(void *, int, int, u_int, long);
 static void	rasops15_makestamp(struct rasops_info *, long);
 #endif
 
 #ifndef RASOPS_SMALL
 /*
- * (2x2)x1 stamp for optimized character blitting
+ * 4x1 stamp for optimized character blitting
  */
 static uint32_t	stamp[32];
 static long	stamp_attr;
 static int	stamp_mutex;	/* XXX see note in readme */
 
 /*
- * XXX this confuses the hell out of gcc2 (not egcs) which always insists
- * that the shift count is negative.
- *
  * offset = STAMP_SHIFT(fontbits, nibble #) & STAMP_MASK
  * destination uint32_t[0] = STAMP_READ(offset)
  * destination uint32_t[1] = STAMP_READ(offset + 4)
  */
-#define STAMP_SHIFT(fb,n)	((n*4-3) >= 0 ? (fb)>>(n*4-3):(fb)<<-(n*4-3))
-#define STAMP_MASK		(15 << 3)
-#define STAMP_READ(o)		(*(uint32_t *)((char *)stamp + (o)))
+#define	STAMP_SHIFT(fb, n)	((n) ? (fb) >> 1: (fb) << 3)
+#define	STAMP_MASK		(0xf << 3)
+#define	STAMP_READ(o)		(*(uint32_t *)((uint8_t *)stamp + (o)))
 #endif
 
 /*
@@ -79,37 +76,36 @@ void
 rasops15_init(struct rasops_info *ri)
 {
 
-	if (FONT_IS_ALPHA(ri->ri_font)) {
-		ri->ri_ops.putchar = rasops15_putchar_aa;
-	} else {
-		switch (ri->ri_font->fontwidth) {
-#ifndef RASOPS_SMALL
-		case 8:
-			ri->ri_ops.putchar = rasops15_putchar8;
-			break;
-
-		case 12:
-			ri->ri_ops.putchar = rasops15_putchar12;
-			break;
-
-		case 16:
-			ri->ri_ops.putchar = rasops15_putchar16;
-			break;
-#endif	/* !RASOPS_SMALL */
-		default:
-			ri->ri_ops.putchar = rasops15_putchar;
-			break;
-		}
-	}
-
 	if (ri->ri_rnum == 0) {
-		ri->ri_rnum = 5;
+		ri->ri_rnum = ri->ri_gnum = ri->ri_bnum = 5;
+		ri->ri_gnum += (ri->ri_depth == 16);
+
 		ri->ri_rpos = 10 + (ri->ri_depth == 16);
-		ri->ri_gnum = 5 + (ri->ri_depth == 16);
 		ri->ri_gpos = 5;
-		ri->ri_bnum = 5;
 		ri->ri_bpos = 0;
 	}
+
+	if (FONT_IS_ALPHA(ri->ri_font)) {
+		ri->ri_ops.putchar = rasops15_putchar_aa;
+		return;
+	}
+
+	switch (ri->ri_font->fontwidth) {
+#ifndef RASOPS_SMALL
+	case 8:
+		ri->ri_ops.putchar = rasops15_putchar8;
+		break;
+	case 12:
+		ri->ri_ops.putchar = rasops15_putchar12;
+		break;
+	case 16:
+		ri->ri_ops.putchar = rasops15_putchar16;
+		break;
+#endif	/* !RASOPS_SMALL */
+	default:
+		ri->ri_ops.putchar = rasops15_putchar;
+		break;
+	}
 }
 
 #define	RASOPS_DEPTH	15
@@ -128,7 +124,6 @@ rasops15_putchar_aa(void *cookie, int ro
 	int x, y, r, g, b, aval;
 	int r1, g1, b1, r0, g0, b0, fgo, bgo;
 
-
 #ifdef RASOPS_CLIPPING
 	/* Catches 'row < 0' case too */
 	if ((unsigned)row >= (unsigned)ri->ri_rows)
@@ -148,8 +143,8 @@ rasops15_putchar_aa(void *cookie, int ro
 	height = font->fontheight;
 	width = font->fontwidth;
 
-	clr[0] = ri->ri_devcmap[(attr >> 16) & 0xf];
-	clr[1] = ri->ri_devcmap[(attr >> 24) & 0xf];
+	clr[0] = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
+	clr[1] = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
 
 	if (uc == ' ') {
 	        for (cnt = 0; cnt < width; cnt++)
@@ -162,8 +157,8 @@ rasops15_putchar_aa(void *cookie, int ro
 	} else {
 		fr = FONT_GLYPH(uc, font, ri);
 
-		fgo = ((attr >> 24) & 0xf) * 3;
-		bgo = ((attr >> 16) & 0xf) * 3;
+		fgo = (((uint32_t)attr >> 24) & 0xf) * 3;
+		bgo = (((uint32_t)attr >> 16) & 0xf) * 3;
 
 		r0 = rasops_cmap[bgo];
 		r1 = rasops_cmap[fgo];
@@ -209,7 +204,7 @@ rasops15_putchar_aa(void *cookie, int ro
 
 #ifndef RASOPS_SMALL
 /*
- * Recompute the (2x2)x1 blitting stamp.
+ * Recompute the 4x1 blitting stamp.
  */
 static void
 rasops15_makestamp(struct rasops_info *ri, long attr)
@@ -217,21 +212,21 @@ rasops15_makestamp(struct rasops_info *r
 	uint32_t fg, bg;
 	int i;
 
-	fg = ri->ri_devcmap[((u_int)attr >> 24) & 0xf] & 0xffff;
-	bg = ri->ri_devcmap[((u_int)attr >> 16) & 0xf] & 0xffff;
+	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 0xffff;
+	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xffff;
 	stamp_attr = attr;
 
 	for (i = 0; i < 32; i += 2) {
 #if BYTE_ORDER == LITTLE_ENDIAN
-		stamp[i] = (i & 16 ? fg : bg);
-		stamp[i] |= ((i & 8 ? fg : bg) << 16);
-		stamp[i + 1] = (i & 4 ? fg : bg);
-		stamp[i + 1] |= ((i & 2 ? fg : bg) << 16);
+		stamp[i]      = (i & 16 ? fg : bg);
+		stamp[i]     |= (i &  8 ? fg : bg) << 16;
+		stamp[i + 1]  = (i &  4 ? fg : bg);
+		stamp[i + 1] |= (i &  2 ? fg : bg) << 16;
 #else
-		stamp[i] = (i & 8 ? fg : bg);
-		stamp[i] |= ((i & 16 ? fg : bg) << 16);
-		stamp[i + 1] = (i & 2 ? fg : bg);
-		stamp[i + 1] |= ((i & 4 ? fg : bg) << 16);
+		stamp[i]      = (i &  8 ? fg : bg);
+		stamp[i]     |= (i & 16 ? fg : bg) << 16;
+		stamp[i + 1]  = (i &  2 ? fg : bg);
+		stamp[i + 1] |= (i &  4 ? fg : bg) << 16;
 #endif
 	}
 }

Index: src/sys/dev/rasops/rasops2.c
diff -u src/sys/dev/rasops/rasops2.c:1.24 src/sys/dev/rasops/rasops2.c:1.25
--- src/sys/dev/rasops/rasops2.c:1.24	Sun Jul 28 02:51:38 2019
+++ src/sys/dev/rasops/rasops2.c	Sun Jul 28 12:06:10 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops2.c,v 1.24 2019/07/28 02:51:38 rin Exp $	*/
+/* 	$NetBSD: rasops2.c,v 1.25 2019/07/28 12:06:10 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops2.c,v 1.24 2019/07/28 02:51:38 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops2.c,v 1.25 2019/07/28 12:06:10 rin Exp $");
 
 #include "opt_rasops.h"
 
@@ -124,8 +124,8 @@ rasops2_putchar(void *cookie, int row, i
 	col = col & 31;
 	rs = ri->ri_stride;
 
-	bg = ri->ri_devcmap[(attr >> 16) & 0xf];
-	fg = ri->ri_devcmap[(attr >> 24) & 0xf];
+	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
+	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
 
 	/* If fg and bg match this becomes a space character */
 	if (fg == bg || uc == ' ') {
@@ -224,8 +224,8 @@ rasops2_makestamp(struct rasops_info *ri
 {
 	int i, fg, bg;
 
-	fg = ri->ri_devcmap[(attr >> 24) & 0xf] & 3;
-	bg = ri->ri_devcmap[(attr >> 16) & 0xf] & 3;
+	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 3;
+	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 3;
 	stamp_attr = attr;
 
 	for (i = 0; i < 16; i++) {

Index: src/sys/dev/rasops/rasops24.c
diff -u src/sys/dev/rasops/rasops24.c:1.35 src/sys/dev/rasops/rasops24.c:1.36
--- src/sys/dev/rasops/rasops24.c:1.35	Thu Jul 25 15:18:53 2019
+++ src/sys/dev/rasops/rasops24.c	Sun Jul 28 12:06:10 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops24.c,v 1.35 2019/07/25 15:18:53 rin Exp $	*/
+/* 	$NetBSD: rasops24.c,v 1.36 2019/07/28 12:06:10 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops24.c,v 1.35 2019/07/25 15:18:53 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops24.c,v 1.36 2019/07/28 12:06:10 rin Exp $");
 
 #include "opt_rasops.h"
 
@@ -47,11 +47,11 @@ __KERNEL_RCSID(0, "$NetBSD: rasops24.c,v
 
 static void 	rasops24_erasecols(void *, int, int, int, long);
 static void 	rasops24_eraserows(void *, int, int, long);
-static void 	rasops24_putchar(void *, int, int, u_int, long attr);
+static void 	rasops24_putchar(void *, int, int, u_int, long);
 #ifndef RASOPS_SMALL
-static void 	rasops24_putchar8(void *, int, int, u_int, long attr);
-static void 	rasops24_putchar12(void *, int, int, u_int, long attr);
-static void 	rasops24_putchar16(void *, int, int, u_int, long attr);
+static void 	rasops24_putchar8(void *, int, int, u_int, long);
+static void 	rasops24_putchar12(void *, int, int, u_int, long);
+static void 	rasops24_putchar16(void *, int, int, u_int, long);
 static void	rasops24_makestamp(struct rasops_info *, long);
 
 /*
@@ -63,17 +63,14 @@ static int	stamp_mutex;	/* XXX see note 
 #endif
 
 /*
- * XXX this confuses the hell out of gcc2 (not egcs) which always insists
- * that the shift count is negative.
- *
  * offset = STAMP_SHIFT(fontbits, nibble #) & STAMP_MASK
  * destination uint32_t[0] = STAMP_READ(offset)
  * destination uint32_t[1] = STAMP_READ(offset + 4)
  * destination uint32_t[2] = STAMP_READ(offset + 8)
  */
-#define STAMP_SHIFT(fb,n)	((n*4-4) >= 0 ? (fb)>>(n*4-4):(fb)<<-(n*4-4))
-#define STAMP_MASK		(0xf << 4)
-#define STAMP_READ(o)		(*(uint32_t *)((char *)stamp + (o)))
+#define	STAMP_SHIFT(fb, n)	((n) ? (fb) : (fb) << 4)
+#define	STAMP_MASK		(0xf << 4)
+#define	STAMP_READ(o)		(*(uint32_t *)((uint8_t *)stamp + (o)))
 
 /*
  * Initialize rasops_info struct for this colordepth.
@@ -82,6 +79,17 @@ void
 rasops24_init(struct rasops_info *ri)
 {
 
+	if (ri->ri_rnum == 0) {
+		ri->ri_rnum = ri->ri_gnum = ri->ri_bnum = 8;
+
+		ri->ri_rpos = 0;
+		ri->ri_gpos = 8;
+		ri->ri_bpos = 16;
+	}
+
+	ri->ri_ops.erasecols = rasops24_erasecols;
+	ri->ri_ops.eraserows = rasops24_eraserows;
+
 	switch (ri->ri_font->fontwidth) {
 #ifndef RASOPS_SMALL
 	case 8:
@@ -98,18 +106,6 @@ rasops24_init(struct rasops_info *ri)
 		ri->ri_ops.putchar = rasops24_putchar;
 		break;
 	}
-
-	if (ri->ri_rnum == 0) {
-		ri->ri_rnum = 8;
-		ri->ri_rpos = 0;
-		ri->ri_gnum = 8;
-		ri->ri_gpos = 8;
-		ri->ri_bnum = 8;
-		ri->ri_bpos = 16;
-	}
-
-	ri->ri_ops.erasecols = rasops24_erasecols;
-	ri->ri_ops.eraserows = rasops24_eraserows;
 }
 
 #define	RASOPS_DEPTH	24
@@ -122,37 +118,37 @@ rasops24_init(struct rasops_info *ri)
 static void
 rasops24_makestamp(struct rasops_info *ri, long attr)
 {
-	u_int fg, bg, c1, c2, c3, c4;
+	uint32_t fg, bg, c1, c2, c3, c4;
 	int i;
 
-	fg = ri->ri_devcmap[((u_int)attr >> 24) & 0xf] & 0xffffff;
-	bg = ri->ri_devcmap[((u_int)attr >> 16) & 0xf] & 0xffffff;
+	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 0xffffff;
+	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xffffff;
 	stamp_attr = attr;
 
 	for (i = 0; i < 64; i += 4) {
 #if BYTE_ORDER == LITTLE_ENDIAN
-		c1 = (i & 32 ? fg : bg);
-		c2 = (i & 16 ? fg : bg);
-		c3 = (i & 8 ? fg : bg);
-		c4 = (i & 4 ? fg : bg);
+		c1 = i & 32 ? fg : bg;
+		c2 = i & 16 ? fg : bg;
+		c3 = i &  8 ? fg : bg;
+		c4 = i &  4 ? fg : bg;
 #else
-		c1 = (i & 8 ? fg : bg);
-		c2 = (i & 4 ? fg : bg);
-		c3 = (i & 16 ? fg : bg);
-		c4 = (i & 32 ? fg : bg);
+		c1 = i &  8 ? fg : bg;
+		c2 = i &  4 ? fg : bg;
+		c3 = i & 16 ? fg : bg;
+		c4 = i & 32 ? fg : bg;
 #endif
-		stamp[i+0] = (c1 <<  8) | (c2 >> 16);
-		stamp[i+1] = (c2 << 16) | (c3 >>  8);
-		stamp[i+2] = (c3 << 24) | c4;
+		stamp[i + 0] = (c1 <<  8) | (c2 >> 16);
+		stamp[i + 1] = (c2 << 16) | (c3 >>  8);
+		stamp[i + 2] = (c3 << 24) |  c4;
 
 #if BYTE_ORDER == LITTLE_ENDIAN
 		if ((ri->ri_flg & RI_BSWAP) == 0) {
 #else
 		if ((ri->ri_flg & RI_BSWAP) != 0) {
 #endif
-			stamp[i+0] = bswap32(stamp[i+0]);
-			stamp[i+1] = bswap32(stamp[i+1]);
-			stamp[i+2] = bswap32(stamp[i+2]);
+			stamp[i + 0] = bswap32(stamp[i + 0]);
+			stamp[i + 1] = bswap32(stamp[i + 1]);
+			stamp[i + 2] = bswap32(stamp[i + 2]);
 		}
 	}
 }
@@ -205,7 +201,7 @@ rasops24_eraserows(void *cookie, int row
 		return;
 #endif
 
-	clr = ri->ri_devcmap[(attr >> 16) & 0xf] & 0xffffff;
+	clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xffffff;
 	xstamp[0] = (clr <<  8) | (clr >> 16);
 	xstamp[1] = (clr << 16) | (clr >>  8);
 	xstamp[2] = (clr << 24) | clr;
@@ -315,7 +311,7 @@ rasops24_erasecols(void *cookie, int row
 	num *= ri->ri_font->fontwidth;
 	height = ri->ri_font->fontheight;
 
-	clr = ri->ri_devcmap[(attr >> 16) & 0xf] & 0xffffff;
+	clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xffffff;
 	xstamp[0] = (clr <<  8) | (clr >> 16);
 	xstamp[1] = (clr << 16) | (clr >>  8);
 	xstamp[2] = (clr << 24) | clr;

Index: src/sys/dev/rasops/rasops32.c
diff -u src/sys/dev/rasops/rasops32.c:1.37 src/sys/dev/rasops/rasops32.c:1.38
--- src/sys/dev/rasops/rasops32.c:1.37	Thu Jul 25 15:18:53 2019
+++ src/sys/dev/rasops/rasops32.c	Sun Jul 28 12:06:10 2019
@@ -1,4 +1,4 @@
-/*	 $NetBSD: rasops32.c,v 1.37 2019/07/25 15:18:53 rin Exp $	*/
+/*	 $NetBSD: rasops32.c,v 1.38 2019/07/28 12:06:10 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops32.c,v 1.37 2019/07/25 15:18:53 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops32.c,v 1.38 2019/07/28 12:06:10 rin Exp $");
 
 #include "opt_rasops.h"
 
@@ -42,8 +42,8 @@ __KERNEL_RCSID(0, "$NetBSD: rasops32.c,v
 #include <dev/wscons/wsconsio.h>
 #include <dev/rasops/rasops.h>
 
-static void 	rasops32_putchar(void *, int, int, u_int, long attr);
-static void 	rasops32_putchar_aa(void *, int, int, u_int, long attr);
+static void 	rasops32_putchar(void *, int, int, u_int, long);
+static void 	rasops32_putchar_aa(void *, int, int, u_int, long);
 #ifndef RASOPS_SMALL
 static void	rasops32_putchar8(void *, int, int, u_int, long);
 static void	rasops32_putchar12(void *, int, int, u_int, long);
@@ -67,7 +67,7 @@ static int	stamp_mutex;	/* XXX see note 
  */
 #define	STAMP_SHIFT(fb, n)	((n) ? (fb) : (fb) << 4)
 #define	STAMP_MASK		(0xf << 4)
-#define	STAMP_READ(o)		(*(uint32_t *)((char *)stamp + (o)))
+#define	STAMP_READ(o)		(*(uint32_t *)((uint8_t *)stamp + (o)))
 
 /*
  * Initialize a 'rasops_info' descriptor for this depth.
@@ -77,11 +77,10 @@ rasops32_init(struct rasops_info *ri)
 {
 
 	if (ri->ri_rnum == 0) {
-		ri->ri_rnum = 8;
+		ri->ri_rnum = ri->ri_gnum = ri->ri_bnum = 8;
+
 		ri->ri_rpos = 0;
-		ri->ri_gnum = 8;
 		ri->ri_gpos = 8;
-		ri->ri_bnum = 8;
 		ri->ri_bpos = 16;
 	}
 
@@ -143,8 +142,8 @@ rasops32_putchar_aa(void *cookie, int ro
 	height = font->fontheight;
 	width = font->fontwidth;
 
-	clr[0] = ri->ri_devcmap[(attr >> 16) & 0xf];
-	clr[1] = ri->ri_devcmap[(attr >> 24) & 0xf];
+	clr[0] = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
+	clr[1] = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
 
 	if (uc == ' ') {
 		for (cnt = 0; cnt < width; cnt++)
@@ -211,10 +210,10 @@ rasops32_makestamp(struct rasops_info *r
 	stamp_attr = attr;
 
 	for (i = 0; i < 64; i += 4) {
-		stamp[i + 0] = (i & 32 ? fg : bg);
-		stamp[i + 1] = (i & 16 ? fg : bg);
-		stamp[i + 2] = (i & 8 ? fg : bg);
-		stamp[i + 3] = (i & 4 ? fg : bg);
+		stamp[i + 0] = i & 32 ? fg : bg;
+		stamp[i + 1] = i & 16 ? fg : bg;
+		stamp[i + 2] = i &  8 ? fg : bg;
+		stamp[i + 3] = i &  4 ? fg : bg;
 	}
 }
 

Index: src/sys/dev/rasops/rasops4.c
diff -u src/sys/dev/rasops/rasops4.c:1.18 src/sys/dev/rasops/rasops4.c:1.19
--- src/sys/dev/rasops/rasops4.c:1.18	Fri Jul 26 06:37:15 2019
+++ src/sys/dev/rasops/rasops4.c	Sun Jul 28 12:06:10 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops4.c,v 1.18 2019/07/26 06:37:15 rin Exp $	*/
+/* 	$NetBSD: rasops4.c,v 1.19 2019/07/28 12:06:10 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops4.c,v 1.18 2019/07/26 06:37:15 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops4.c,v 1.19 2019/07/28 12:06:10 rin Exp $");
 
 #include "opt_rasops.h"
 
@@ -124,8 +124,8 @@ rasops4_putchar(void *cookie, int row, i
 	col = col & 31;
 	rs = ri->ri_stride;
 
-	bg = ri->ri_devcmap[(attr >> 16) & 0xf];
-	fg = ri->ri_devcmap[(attr >> 24) & 0xf];
+	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
+	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
 
 	/* If fg and bg match this becomes a space character */
 	if (fg == bg || uc == ' ') {
@@ -224,8 +224,8 @@ rasops4_makestamp(struct rasops_info *ri
 {
 	int i, fg, bg;
 
-	fg = ri->ri_devcmap[(attr >> 24) & 0xf] & 0xf;
-	bg = ri->ri_devcmap[(attr >> 16) & 0xf] & 0xf;
+	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 0xf;
+	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xf;
 	stamp_attr = attr;
 
 	for (i = 0; i < 16; i++) {

Index: src/sys/dev/rasops/rasops8.c
diff -u src/sys/dev/rasops/rasops8.c:1.42 src/sys/dev/rasops/rasops8.c:1.43
--- src/sys/dev/rasops/rasops8.c:1.42	Thu Jul 25 15:18:53 2019
+++ src/sys/dev/rasops/rasops8.c	Sun Jul 28 12:06:10 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops8.c,v 1.42 2019/07/25 15:18:53 rin Exp $	*/
+/* 	$NetBSD: rasops8.c,v 1.43 2019/07/28 12:06:10 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops8.c,v 1.42 2019/07/25 15:18:53 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops8.c,v 1.43 2019/07/28 12:06:10 rin Exp $");
 
 #include "opt_rasops.h"
 
@@ -42,12 +42,12 @@ __KERNEL_RCSID(0, "$NetBSD: rasops8.c,v 
 #include <dev/wscons/wsconsio.h>
 #include <dev/rasops/rasops.h>
 
-static void 	rasops8_putchar(void *, int, int, u_int, long attr);
-static void 	rasops8_putchar_aa(void *, int, int, u_int, long attr);
+static void 	rasops8_putchar(void *, int, int, u_int, long);
+static void 	rasops8_putchar_aa(void *, int, int, u_int, long);
 #ifndef RASOPS_SMALL
-static void 	rasops8_putchar8(void *, int, int, u_int, long attr);
-static void 	rasops8_putchar12(void *, int, int, u_int, long attr);
-static void 	rasops8_putchar16(void *, int, int, u_int, long attr);
+static void 	rasops8_putchar8(void *, int, int, u_int, long);
+static void 	rasops8_putchar12(void *, int, int, u_int, long);
+static void 	rasops8_putchar16(void *, int, int, u_int, long);
 static void	rasops8_makestamp(struct rasops_info *ri, long);
 
 /*
@@ -59,15 +59,12 @@ static int	stamp_mutex;	/* XXX see note 
 #endif
 
 /*
- * XXX this confuses the hell out of gcc2 (not egcs) which always insists
- * that the shift count is negative.
- *
  * offset = STAMP_SHIFT(fontbits, nibble #) & STAMP_MASK
  * destination = STAMP_READ(offset)
  */
-#define STAMP_SHIFT(fb,n)	((n*4-2) >= 0 ? (fb)>>(n*4-2):(fb)<<-(n*4-2))
-#define STAMP_MASK		(0xf << 2)
-#define STAMP_READ(o)		(*(uint32_t *)((char *)stamp + (o)))
+#define	STAMP_SHIFT(fb, n)	((n) ? (fb) >> 2 : (fb) << 2)
+#define	STAMP_MASK		(0xf << 2)
+#define	STAMP_READ(o)		(*(uint32_t *)((uint8_t *)stamp + (o)))
 
 /*
  * Initialize a 'rasops_info' descriptor for this depth.
@@ -76,34 +73,36 @@ void
 rasops8_init(struct rasops_info *ri)
 {
 
-	if (FONT_IS_ALPHA(ri->ri_font)) {
-		ri->ri_ops.putchar = rasops8_putchar_aa;
-	} else {
-		switch (ri->ri_font->fontwidth) {
-#ifndef RASOPS_SMALL
-		case 8:
-			ri->ri_ops.putchar = rasops8_putchar8;
-			break;
-		case 12:
-			ri->ri_ops.putchar = rasops8_putchar12;
-			break;
-		case 16:
-			ri->ri_ops.putchar = rasops8_putchar16;
-			break;
-#endif /* !RASOPS_SMALL */
-		default:
-			ri->ri_ops.putchar = rasops8_putchar;
-			break;
-		}
-	}
 	if (ri->ri_flg & RI_8BIT_IS_RGB) {
-		ri->ri_rnum = 3;
+		ri->ri_rnum = ri->ri_gnum = 3;
+		ri->ri_bnum = 2;
+
 		ri->ri_rpos = 5;
-		ri->ri_gnum = 3;
 		ri->ri_gpos = 2;
-		ri->ri_bnum = 2;
 		ri->ri_bpos = 0;
 	}
+
+	if (FONT_IS_ALPHA(ri->ri_font)) {
+		ri->ri_ops.putchar = rasops8_putchar_aa;
+		return;
+	}
+
+	switch (ri->ri_font->fontwidth) {
+#ifndef RASOPS_SMALL
+	case 8:
+		ri->ri_ops.putchar = rasops8_putchar8;
+		break;
+	case 12:
+		ri->ri_ops.putchar = rasops8_putchar12;
+		break;
+	case 16:
+		ri->ri_ops.putchar = rasops8_putchar16;
+		break;
+#endif /* !RASOPS_SMALL */
+	default:
+		ri->ri_ops.putchar = rasops8_putchar;
+		break;
+	}
 }
 
 #define	RASOPS_DEPTH	8
@@ -120,7 +119,7 @@ rasops8_putchar_aa(void *cookie, int row
 	int r1, g1, b1, r0, g0, b0, fgo, bgo;
 	uint8_t scanline[32] __attribute__ ((aligned(8)));
 
-	hrp = NULL;
+	hrp = NULL;	/* XXX GCC */
 
 	if (!CHAR_IN_FONT(uc, font))
 		return;
@@ -140,8 +139,8 @@ rasops8_putchar_aa(void *cookie, int row
 
 	height = font->fontheight;
 	width = font->fontwidth;
-	bg = (uint8_t)ri->ri_devcmap[(attr >> 16) & 0xf];
-	fg = (uint8_t)ri->ri_devcmap[(attr >> 24) & 0xf];
+	bg = (uint8_t)ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
+	fg = (uint8_t)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
 
 	if (uc == ' ') {
 
@@ -158,8 +157,8 @@ rasops8_putchar_aa(void *cookie, int row
 		/*
 		 * we need the RGB colours here, get offsets into rasops_cmap
 		 */
-		fgo = ((attr >> 24) & 0xf) * 3;
-		bgo = ((attr >> 16) & 0xf) * 3;
+		fgo = (((uint32_t)attr >> 24) & 0xf) * 3;
+		bgo = (((uint32_t)attr >> 16) & 0xf) * 3;
 
 		r0 = rasops_cmap[bgo];
 		r1 = rasops_cmap[fgo];
@@ -221,8 +220,8 @@ rasops8_makestamp(struct rasops_info *ri
 	uint32_t fg, bg;
 	int i;
 
-	fg = ri->ri_devcmap[(attr >> 24) & 0xf] & 0xff;
-	bg = ri->ri_devcmap[(attr >> 16) & 0xf] & 0xff;
+	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 0xff;
+	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xff;
 	stamp_attr = attr;
 
 	for (i = 0; i < 16; i++) {
@@ -233,16 +232,16 @@ rasops8_makestamp(struct rasops_info *ri
 #endif
 		if ((ri->ri_flg & RI_BSWAP) == NEED_LITTLE_ENDIAN_STAMP) {
 			/* little endian */
-			stamp[i] = (i & 8 ? fg : bg);
-			stamp[i] |= ((i & 4 ? fg : bg) << 8);
-			stamp[i] |= ((i & 2 ? fg : bg) << 16);
-			stamp[i] |= ((i & 1 ? fg : bg) << 24);
+			stamp[i]  = (i & 8 ? fg : bg);
+			stamp[i] |= (i & 4 ? fg : bg) << 8;
+			stamp[i] |= (i & 2 ? fg : bg) << 16;
+			stamp[i] |= (i & 1 ? fg : bg) << 24;
 		} else {
 			/* big endian */
-			stamp[i] = (i & 1 ? fg : bg);
-			stamp[i] |= ((i & 2 ? fg : bg) << 8);
-			stamp[i] |= ((i & 4 ? fg : bg) << 16);
-			stamp[i] |= ((i & 8 ? fg : bg) << 24);
+			stamp[i]  = (i & 1 ? fg : bg);
+			stamp[i] |= (i & 2 ? fg : bg) << 8;
+			stamp[i] |= (i & 4 ? fg : bg) << 16;
+			stamp[i] |= (i & 8 ? fg : bg) << 24;
 		}
 	}
 }

Index: src/sys/dev/rasops/rasops_bitops.h
diff -u src/sys/dev/rasops/rasops_bitops.h:1.16 src/sys/dev/rasops/rasops_bitops.h:1.17
--- src/sys/dev/rasops/rasops_bitops.h:1.16	Thu Jul 25 02:26:32 2019
+++ src/sys/dev/rasops/rasops_bitops.h	Sun Jul 28 12:06:10 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops_bitops.h,v 1.16 2019/07/25 02:26:32 rin Exp $	*/
+/* 	$NetBSD: rasops_bitops.h,v 1.17 2019/07/28 12:06:10 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@ NAME(erasecols)(void *cookie, int row, i
 	col *= ri->ri_font->fontwidth << PIXEL_SHIFT;
 	num *= ri->ri_font->fontwidth << PIXEL_SHIFT;
 	height = ri->ri_font->fontheight;
-	clr = ri->ri_devcmap[(attr >> 16) & 0xf];
+	clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
 	rp = (uint32_t *)(ri->ri_bits + row*ri->ri_yscale + ((col >> 3) & ~3));
 	if (ri->ri_hwbits)
 		hrp = (uint32_t *)(ri->ri_hwbits + row*ri->ri_yscale +

Index: src/sys/dev/rasops/rasops_putchar.h
diff -u src/sys/dev/rasops/rasops_putchar.h:1.1 src/sys/dev/rasops/rasops_putchar.h:1.2
--- src/sys/dev/rasops/rasops_putchar.h:1.1	Thu Jul 25 15:18:53 2019
+++ src/sys/dev/rasops/rasops_putchar.h	Sun Jul 28 12:06:10 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rasops_putchar.h,v 1.1 2019/07/25 15:18:53 rin Exp $ */
+/* $NetBSD: rasops_putchar.h,v 1.2 2019/07/28 12:06:10 rin Exp $ */
 
 /* NetBSD: rasops8.c,v 1.41 2019/07/25 03:02:44 rin Exp  */
 /*-
@@ -68,13 +68,13 @@
 static void
 PUTCHAR(RASOPS_DEPTH)(void *cookie, int row, int col, u_int uc, long attr)
 {
-	int width, height, cnt, fs, fb;
-	uint8_t *dp, *rp, *hp, *hrp, *fr;
 	struct rasops_info *ri = (struct rasops_info *)cookie;
 	struct wsdisplay_font *font = PICK_FONT(ri, uc);
+	int width, height, cnt, fs, fb;
+	uint8_t *dp, *rp, *hp, *hrp, *fr;
 	CLR_TYPE clr[2];
 
-	hp = hrp = NULL;
+	hp = hrp = NULL;	/* XXX GCC */
 
 	if (!CHAR_IN_FONT(uc, font))
 		return;
@@ -96,8 +96,8 @@ PUTCHAR(RASOPS_DEPTH)(void *cookie, int 
 	height = font->fontheight;
 	width = font->fontwidth;
 
-	clr[0] = (CLR_TYPE)ri->ri_devcmap[(attr >> 16) & 0xf];
-	clr[1] = (CLR_TYPE)ri->ri_devcmap[(attr >> 24) & 0xf];
+	clr[0] = (CLR_TYPE)ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
+	clr[1] = (CLR_TYPE)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
 
 	if (uc == ' ') {
 		while (height--) {

Index: src/sys/dev/rasops/rasops_putchar_width.h
diff -u src/sys/dev/rasops/rasops_putchar_width.h:1.5 src/sys/dev/rasops/rasops_putchar_width.h:1.6
--- src/sys/dev/rasops/rasops_putchar_width.h:1.5	Sun Jul 28 10:07:43 2019
+++ src/sys/dev/rasops/rasops_putchar_width.h	Sun Jul 28 12:06:10 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rasops_putchar_width.h,v 1.5 2019/07/28 10:07:43 rin Exp $ */
+/* $NetBSD: rasops_putchar_width.h,v 1.6 2019/07/28 12:06:10 rin Exp $ */
 
 /* NetBSD: rasops8.c,v 1.41 2019/07/25 03:02:44 rin Exp  */
 /*-
@@ -65,7 +65,7 @@
 
 #define	SUBST_GLYPH1(index, nibble, off)				\
 	do {								\
-		so = STAMP_SHIFT(fr[index], nibble) & STAMP_MASK;	\
+		int so = STAMP_SHIFT(fr[index], nibble) & STAMP_MASK;	\
 		rp[(off) * 1 + 0] = STAMP_READ(so);			\
 		if (ri->ri_hwbits) {					\
 			hrp[(off) * 1 + 0] = STAMP_READ(so);		\
@@ -83,7 +83,7 @@
 
 #define	SUBST_GLYPH1(index, nibble, off)				\
 	do {								\
-		so = STAMP_SHIFT(fr[index], nibble) & STAMP_MASK;	\
+		int so = STAMP_SHIFT(fr[index], nibble) & STAMP_MASK;	\
 		rp[(off) * 2 + 0] = STAMP_READ(so);			\
 		rp[(off) * 2 + 1] = STAMP_READ(so +  4);		\
 		if (ri->ri_hwbits) {					\
@@ -107,7 +107,7 @@
 
 #define	SUBST_GLYPH1(index, nibble, off)				\
 	do {								\
-		so = STAMP_SHIFT(fr[index], nibble) & STAMP_MASK;	\
+		int so = STAMP_SHIFT(fr[index], nibble) & STAMP_MASK;	\
 		rp[(off) * 3 + 0] = STAMP_READ(so);			\
 		rp[(off) * 3 + 1] = STAMP_READ(so +  4);		\
 		rp[(off) * 3 + 2] = STAMP_READ(so +  8);		\
@@ -130,7 +130,7 @@
 
 #define	SUBST_GLYPH1(index, nibble, off)				\
 	do {								\
-		so = STAMP_SHIFT(fr[index], nibble) & STAMP_MASK;	\
+		int so = STAMP_SHIFT(fr[index], nibble) & STAMP_MASK;	\
 		rp[(off) * 4 + 0] = STAMP_READ(so);			\
 		rp[(off) * 4 + 1] = STAMP_READ(so +  4);		\
 		rp[(off) * 4 + 2] = STAMP_READ(so +  8);		\
@@ -202,8 +202,8 @@ PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
 	struct wsdisplay_font *font = PICK_FONT(ri, uc);
-	int height, so, fs;
-	uint32_t *rp, *hrp = NULL;
+	int height, fs;
+	uint32_t *rp, *hrp;
 	uint8_t *fr;
 
 	hrp = NULL; /* XXX GCC */

Reply via email to