Subject: port-hpcmips/36666: [dM] hpcfb space optimization code clears incorrectly
To: None <port-hpcmips-maintainer@netbsd.org, gnats-admin@netbsd.org,>
From: der Mouse <mouse@Rodents.Montreal.QC.CA>
List: netbsd-bugs
Date: 07/19/2007 05:10:00
>Number:         36666
>Category:       port-hpcmips
>Synopsis:       [dM] dev/hpc/hpcfb.c space optimization code incorrectly clears areas sometimes
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    port-hpcmips-maintainer
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Jul 19 05:10:00 +0000 2007
>Originator:     der Mouse
>Release:        NetBSD 3.1
>Organization:
	Dis-
>Environment:
System: NetBSD Darkstar.Rodents.Montreal.QC.CA 3.1 NetBSD 3.1 (DARKSTAR) #11: Wed Jul 18 23:07:02 EDT 2007 mouse@Darkstar.Rodents.Montreal.QC.CA:/usr/src/sys/arch/hpcmips/compile/DARKSTAR hpcmips
Architecture: mipsel
Machine: hpcmips
hpcfb.c,v 1.31.2.1
>Description:
	Under some circumstances, the code in hpcfb.c that attempts to
	avoid rewriting stuff unnecessarily (mostly, the stuff using
	maxcol/spacecol) clears character cells incorrectly.
>How-To-Repeat:
	I've constructed files to demonstrate the bug.  This was
	observed with a text editor, on a file which I am not prepared
	to disclose the exact contents of, but it turns out that this
	obfuscated version works equally well to demonstrate the bug.

	$ uudecode -p > setup-stuff << \END
	begin 644 foo
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
	L&ULS-3LT,D@;6S=M("`@*AM;,3<[,3-(&ULQ0!M;;6@;6S%`91M;,3LQ2`I4
	`
	end
	END
	$ uudecode -p > show-bug << \END
	begin 644 foo
	$&ULQ30``
	`
	end
	END

	Then, on a 106x36 hpcfb-driven display using "sun" emulation
	(in my case, a z50 display with a 6x13 font - a suitable font
	is enclosed below), "cat setup-stuff" will display a screenful
	of text.  Note the line near the middle reading
	"InfibulateTheGonkulator(1);".

	Then "cat setup-stuff show-bug".  As you can see by looking at
	it with (eg) hexdump, show-bug just scrolls the screen by one
	line.  Note that everything after the "The" on the line I
	pointed out above gets erased (incorrectly) by the scroll.

	Here's that 6x13 font, in the form of a (bzip2ed) .h file
	suitable for dropping into dev/wsfont/ (with suitable edits to
	wsfont.c and the kernel config, of course).

	begin 644 fixed6x13.h.bz2
	M0EIH.3%!62936=&4=M4`C$!?__0P?_______________________________
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
	CB(]%,6F2UI+IZX$B]G,M(Z(,8#`0``!_(7<D4X4)#1E';5#&
	`
	end

>Fix:
	The best I can offer right now is the hpcfb.c I'm using.  It
	actually has a number of changes:

	- Fixes this problem.  I've just ripped out all the whitespace
	   optimization code; it impairs speed, but I prefer slow to
	   broken.

	- Uses RI_CENTER, in case the font size does not divide the
	   screen size exactly (I'd rather have it centred than smushed
	   into the upper left).

	- Fixes a bug that prevents RI_CENTER from working right (see
	   the change "@@ -853,7 +852,9 @@" below).

	- Makes clearing the framebuffer clear the whole framebuffer,
	   even if some of it doesn't correspond to character
	   positions.

	I realize that this is not the most useful fix, but at the
	moment it's all I have to offer.  I've been meaning to write
	something better; if I do, I'll add it to this PR.

	In the meantime, the hpcfb.c I mentioned above is at
	ftp.rodents.montreal.qc.ca:/mouse/misc/hpcfb/interim-hpcfb.c.
	Enclosed here is a diff from hpcfb.c,v 1.31.2.1:

	--- hpcfb.c.stock	2007-07-18 23:02:14.000000000 -0400
	+++ hpcfb.c.mouse	2007-05-05 16:02:57.000000000 -0400
	@@ -109,8 +109,6 @@
	 };
	 
	 struct hpcfb_tvrow {
	-	int maxcol;
	-	int spacecol;
	 	struct hpcfb_vchar col[HPCFB_MAX_COLUMN];
	 };
	 
	@@ -448,6 +446,7 @@
	 #else
	 	ri->ri_flg = RI_CURSOR;
	 #endif
	+	ri->ri_flg |= RI_CENTER;
	 	switch (ri->ri_depth) {
	 	case 8:
	 		if (32 <= fbconf->hf_pack_width &&
	@@ -853,7 +852,9 @@
	 	/* switch screen to new one */
	 	dc->dc_state |= HPCFB_DC_CURRENT;
	 	dc->dc_state &= ~HPCFB_DC_ABORT;
	+	/* XXX not until "too dangerous" setting 6 lines above is enabled
	 	dc->dc_rinfo.ri_bits = dc->dc_fbaddr;
	+	*/
	 	sc->sc_dc = dc;
	 
	 	/* redraw screen image */
	@@ -965,7 +966,6 @@
	 {
	 	struct hpcfb_tvrow *vscn = dc->dc_tvram;
	 	struct hpcfb_vchar *vc = &vscn[row].col[col];
	-	struct hpcfb_vchar *vcb;
	 
	 	if (vscn == 0)
	 		return;
	@@ -978,14 +978,6 @@
	 		dc->dc_max_row = row;
	 
	 #endif /* HPCFB_JUMP */
	-	if (vscn[row].maxcol +1 == col)
	-		vscn[row].maxcol = col;
	-	else if (vscn[row].maxcol < col) {
	-		vcb =  &vscn[row].col[vscn[row].maxcol+1];
	-		memset(vcb, 0,
	-		    sizeof(struct hpcfb_vchar)*(col-vscn[row].maxcol-1));
	-		vscn[row].maxcol = col;
	-	}
	 	vc->c = uc;
	 	vc->attr = attr;
	 	dc->dc_state &= ~HPCFB_DC_TDRAWING;
	@@ -1062,10 +1054,7 @@
	 #endif /* HPCFB_JUMP */
	 
	 	memcpy(dvc, svc, ncols*sizeof(struct hpcfb_vchar));
	-	if (vscn[row].maxcol < srccol+ncols-1)
	-		vscn[row].maxcol = srccol+ncols-1;
	-	if (vscn[row].maxcol < dstcol+ncols-1)
	-		vscn[row].maxcol = dstcol+ncols-1;
	+
	 	dc->dc_state &= ~HPCFB_DC_TDRAWING;
	 #ifdef HPCFB_JUMP
	 	hpcfb_check_update(dc);
	@@ -1124,6 +1113,7 @@
	     int ncols, long attr)
	 {
	 	struct hpcfb_tvrow *vscn = dc->dc_tvram;
	+	struct hpcfb_tvrow *r;
	 
	 	if (vscn == 0)
	 		return;
	@@ -1136,9 +1126,12 @@
	 		dc->dc_max_row = row;
	 #endif /* HPCFB_JUMP */
	 
	-	vscn[row].maxcol = startcol-1;
	-	if (vscn[row].spacecol < startcol+ncols-1)
	-		vscn[row].spacecol = startcol+ncols-1;
	+	r = &vscn[row];
	+	for (;ncols>0;startcol++,ncols--) {
	+		r->col[startcol].c = ' ';
	+		r->col[startcol].attr = 0;
	+	}
	+
	 	dc->dc_state &= ~HPCFB_DC_TDRAWING;
	 #ifdef HPCFB_JUMP
	 	hpcfb_check_update(dc);
	@@ -1223,10 +1216,7 @@
	 	}
	 
	 	for (i = 0; i < num; i++) {
	-		memcpy(&dvc->col[0], &svc->col[0], sizeof(struct hpcfb_vchar)*(svc->maxcol+1));
	-		if (svc->maxcol < dvc->maxcol && dvc->spacecol < dvc->maxcol)
	-			dvc->spacecol = dvc->maxcol;
	-		dvc->maxcol = svc->maxcol;
	+		memcpy(&dvc->col[0], &svc->col[0], sizeof(struct hpcfb_vchar)*dc->dc_cols);
	 		svc+=d;
	 		dvc+=d;
	 	}
	@@ -1244,7 +1234,6 @@
	 {
	 	struct hpcfb_devconfig *dc = (struct hpcfb_devconfig *)cookie;
	 	struct rasops_info *ri = &dc->dc_rinfo;
	-	int cols;
	 	struct hpcfb_tvrow *vscn = dc->dc_tvram;
	 	struct hpcfb_vchar *svc;
	 	int i, j;
	@@ -1272,6 +1261,20 @@
	 	if (ri->ri_bits == NULL)
	 		return;
	 
	+	if (all) {
	+		/* Make sure we clear the whole framebuffer, even if
	+		   it's not all in use by characters.  XXX goes under
	+		   the hood of rasops allocattr in the way it extracts
	+		   the bg colour-- but so does hpcfb_putchar().... */
	+		long int attr;
	+		struct rasops_info *ri;
	+		hpcfb_allocattr(dc,WSCOL_WHITE,WSCOL_BLACK,0,&attr);
	+		ri = &dc->dc_rinfo;
	+		memset( dc->dc_fbaddr,
	+			ri->ri_devcmap[(attr>>16)&15],
	+			ri->ri_stride*ri->ri_height );
	+	}
	+
	 	dc->dc_state |= HPCFB_DC_DRAWING;
	 	dc->dc_state |= HPCFB_DC_TDRAWING;
	 	for (i = 0; i < num; i++) {
	@@ -1279,27 +1282,15 @@
	 			break;
	 		if ((dc->dc_state&HPCFB_DC_CURRENT) == 0)
	 			break;
	-		cols = vscn[row+i].maxcol;
	-		for (j = 0; j <= cols; j++) {
	+		svc = &vscn[row+i].col[0];
	+		for (j = 0; j < dc->dc_cols; j++) {
	 			if (dc->dc_state&HPCFB_DC_ABORT)
	 				continue;
	 			if ((dc->dc_state&HPCFB_DC_CURRENT) == 0)
	 				continue;
	-			svc = &vscn[row+i].col[j];
	 			rasops_emul.putchar(ri, row + i, j, svc->c, svc->attr);
	+			svc ++;
	 		}
	-		if (all)
	-			cols = dc->dc_cols-1;
	-		else
	-			cols = vscn[row+i].spacecol;
	-		for (; j <= cols; j++) {
	-			if (dc->dc_state&HPCFB_DC_ABORT)
	-				continue;
	-			if ((dc->dc_state&HPCFB_DC_CURRENT) == 0)
	-				continue;
	-			rasops_emul.putchar(ri, row + i, j, ' ', 0);
	-		}
	-		vscn[row+i].spacecol = 0;
	 	}
	 	if (dc->dc_state&HPCFB_DC_ABORT)
	 		dc->dc_state &= ~HPCFB_DC_ABORT;
	@@ -1446,8 +1437,9 @@
	 hpcfb_tv_eraserows(struct hpcfb_devconfig *dc, int row, int nrow, long attr)
	 {
	 	struct hpcfb_tvrow *vscn = dc->dc_tvram;
	-	int cols;
	 	int i;
	+	int j;
	+	struct hpcfb_vchar *svc;
	 
	 	if (vscn == 0)
	 		return;
	@@ -1462,10 +1454,11 @@
	 #endif /* HPCFB_JUMP */
	 
	 	for (i = 0; i < nrow; i++) {
	-		cols = vscn[row+i].maxcol;
	-		if (vscn[row+i].spacecol < cols)
	-			vscn[row+i].spacecol = cols;
	-		vscn[row+i].maxcol = -1;
	+		svc = &vscn[row+i].col[0];
	+		for (j = 0; j < dc->dc_cols; j ++) {
	+			svc[j].c = ' ';
	+			svc[j].attr = 0;
	+		}
	 	}
	 #ifdef HPCFB_JUMP
	 	hpcfb_check_update(dc);

/~\ The ASCII				der Mouse
\ / Ribbon Campaign
 X  Against HTML	       mouse@rodents.montreal.qc.ca
/ \ Email!	     7D C8 61 52 5D E7 2D 39  4E F1 31 3E E8 B3 27 4B