From ijliao@Terry.Dorm10.NCTU.edu.tw  Fri Jan 15 19:55:31 1999
Received: from Terry.Dorm10.NCTU.edu.tw (Terry.Dorm10.NCTU.edu.tw [140.113.122.99])
          by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id TAA26548
          for <FreeBSD-gnats-submit@freebsd.org>; Fri, 15 Jan 1999 19:54:30 -0800 (PST)
          (envelope-from ijliao@Terry.Dorm10.NCTU.edu.tw)
Received: (from ijliao@localhost)
	by Terry.Dorm10.NCTU.edu.tw (8.9.2/8.9.1) id LAA01424;
	Sat, 16 Jan 1999 11:54:19 +0800 (CST)
Message-Id: <199901160354.LAA01424@Terry.Dorm10.NCTU.edu.tw>
Date: Sat, 16 Jan 1999 11:54:19 +0800 (CST)
From: Ying-Chieh Liao <ijliao@Terry.Dorm10.NCTU.edu.tw>
Reply-To: ijliao@Terry.Dorm10.NCTU.edu.tw
To: FreeBSD-gnats-submit@freebsd.org
Subject: console become yellow after running X
X-Send-Pr-Version: 3.2

>Number:         9521
>Category:       kern
>Synopsis:       console become yellow after running X
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Jan 15 20:00:01 PST 1999
>Closed-Date:    Wed Jan 27 07:10:35 PST 1999
>Last-Modified:  Wed Jan 27 07:11:14 PST 1999
>Originator:     Ying-Chieh Liao
>Release:        FreeBSD 3.0-CURRENT i386
>Organization:
NCTU CSIE
>Environment:

FreeBSD Terry.Dorm10.NCTU.edu.tw 3.0-CURRENT FreeBSD 3.0-CURRENT #1: Sat Jan 16
01:53:53 CST 1999     root@Terry.Dorm10.NCTU.edu.tw:/usr/src/sys/compile/TERRY
i386

kernel config :

options         VESA                    # needs VM86 defined too!!
pseudo-device   splash

device          sc0     at isa? tty

controller      atkbdc0 at isa? port IO_KBD tty
device          atkbd0  at isa? tty irq 1
device          vga0    at isa? port ? conflicts

dmesg :

vga0: <Matrox MGA 1024SG/1064SG/1164SG graphics accelerator> rev 0x03 int a irq
 10 on pci0.15.0
sc0 on isa
sc0: VGA color <16 virtual consoles, flags=0x0>
atkbdc0 at 0x60-0x6f on motherboard
atkbd0 irq 1 on isa
vga0 at 0x3b0-0x3df maddr 0xa0000 msize 131072 on isa

X : XttXF86srv-SVGA

>Description:

it's ok while booting up
but after i use X and press Ctrl-Alt-F1 to switch to ttyv0, it becomes
yellow...and i can't see any blue words

>How-To-Repeat:

install new sc0 driver and use X
after that, use Ctrl-Alt-F1 to switch to ttyv0

>Fix:
>Release-Note:
>Audit-Trail:

From: Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
To: ijliao@terry.dorm10.nctu.edu.tw
Cc: FreeBSD-gnats-submit@freebsd.org, yokota@zodiac.mech.utsunomiya-u.ac.jp
Subject: Re: kern/9521: console become yellow after running X 
Date: Sat, 16 Jan 1999 18:32:09 +0900

 >>Number:         9521
 >>Category:       kern
 >>Synopsis:       console become yellow after running X
 [...]
 >>Originator:     Ying-Chieh Liao
 >>Release:        FreeBSD 3.0-CURRENT i386
 >>Organization:
 >NCTU CSIE
 >>Environment:
 >
 >FreeBSD Terry.Dorm10.NCTU.edu.tw 3.0-CURRENT FreeBSD 3.0-CURRENT #1: Sat Jan 1
 >6
 >01:53:53 CST 1999     root@Terry.Dorm10.NCTU.edu.tw:/usr/src/sys/compile/TERRY
 >i386
 [...]
 >>Description:
 >
 >it's ok while booting up
 >but after i use X and press Ctrl-Alt-F1 to switch to ttyv0, it becomes
 >yellow...and i can't see any blue words
 
 Apply the following patch to /sys/i386/isa/vesa.c and rebuild the kernel
 and /sys/modules/vesa.
 
 Please report if it works for you.
 
 Kazu
 yokota@FreeBSD.ORG
 
 Index: vesa.c
 ===================================================================
 RCS file: /src/CVS/src/sys/i386/isa/vesa.c,v
 retrieving revision 1.13
 diff -u -r1.13 vesa.c
 --- vesa.c	1999/01/13 01:16:39	1.13
 +++ vesa.c	1999/01/15 07:42:34
 @@ -152,8 +152,10 @@
  static int vesa_bios_get_mode(int mode, struct vesa_mode *vmode);
  static int vesa_bios_set_mode(int mode);
  static int vesa_bios_set_dac(int bits);
 -static int vesa_bios_save_palette(int start, int colors, u_char *palette);
 -static int vesa_bios_load_palette(int start, int colors, u_char *palette);
 +static int vesa_bios_save_palette(int start, int colors, u_char *palette,
 +				  int bits);
 +static int vesa_bios_load_palette(int start, int colors, u_char *palette,
 +				  int bits);
  #define STATE_SIZE	0
  #define STATE_SAVE	1
  #define STATE_LOAD	2
 @@ -239,11 +241,13 @@
  	vmf.vmf_eax = 0x4f08;
  	vmf.vmf_ebx = (bits << 8);
  	err = vm86_intcall(0x10, &vmf);
 -	return ((err != 0) || (vmf.vmf_eax != 0x4f));
 +	if ((err != 0) || (vmf.vmf_eax != 0x4f))
 +		return 6;	/* XXX */
 +	return ((vmf.vmf_ebx >> 8) & 0x00ff);
  }
  
  static int
 -vesa_bios_save_palette(int start, int colors, u_char *palette)
 +vesa_bios_save_palette(int start, int colors, u_char *palette, int bits)
  {
  	struct vm86frame vmf;
  	u_char *p;
 @@ -263,17 +267,18 @@
  		return 1;
  	}
  
 +	bits = 8 - bits;
  	for (i = 0; i < colors; ++i) {
 -		palette[i*3]     = p[i*4 + 1];
 -		palette[i*3 + 1] = p[i*4 + 2];
 -		palette[i*3 + 2] = p[i*4 + 3];
 +		palette[i*3]     = p[i*4 + 2] << bits;
 +		palette[i*3 + 1] = p[i*4 + 1] << bits;
 +		palette[i*3 + 2] = p[i*4] << bits;
  	}
  	free(p, M_DEVBUF);
  	return 0;
  }
  
  static int
 -vesa_bios_load_palette(int start, int colors, u_char *palette)
 +vesa_bios_load_palette(int start, int colors, u_char *palette, int bits)
  {
  	struct vm86frame vmf;
  	u_char *p;
 @@ -281,11 +286,12 @@
  	int i;
  
  	p = malloc(colors*4, M_DEVBUF, M_WAITOK);
 +	bits = 8 - bits;
  	for (i = 0; i < colors; ++i) {
 -		p[i*4]     = 0;
 -		p[i*4 + 1] = palette[i*3];
 -		p[i*4 + 2] = palette[i*3 + 1];
 -		p[i*4 + 3] = palette[i*3 + 2];
 +		p[i*4]	   = palette[i*3 + 2] >> bits;
 +		p[i*4 + 1] = palette[i*3 + 1] >> bits;
 +		p[i*4 + 2] = palette[i*3] >> bits;
 +		p[i*4 + 3] = 0;
  	}
  
  	bzero(&vmf, sizeof(vmf));
 @@ -779,21 +785,35 @@
  static int
  vesa_save_palette(video_adapter_t *adp, u_char *palette)
  {
 -	if ((adp != vesa_adp) || !(vesa_adp_info->v_flags & V_DAC8) 
 -	    || vesa_bios_set_dac(8))
 -		return (*prevvidsw->save_palette)(adp, palette);
 +	int bits;
 +	int error;
 +
 +	if ((adp == vesa_adp) && (vesa_adp_info->v_flags & V_DAC8) 
 +	    && ((bits = vesa_bios_set_dac(8)) > 6)) {
 +		error = vesa_bios_save_palette(0, 256, palette, bits);
 +		if (error == 0)
 +			return 0
 +		vesa_bios_set_dac(6);
 +	}
  
 -	return vesa_bios_save_palette(0, 256, palette);
 +	return (*prevvidsw->save_palette)(adp, palette);
  }
  
  static int
  vesa_load_palette(video_adapter_t *adp, u_char *palette)
  {
 -	if ((adp != vesa_adp) || !(vesa_adp_info->v_flags & V_DAC8) 
 -	    || vesa_bios_set_dac(8))
 -		return (*prevvidsw->load_palette)(adp, palette);
 +	int bits;
 +	int error;
 +
 +	if ((adp == vesa_adp) && (vesa_adp_info->v_flags & V_DAC8) 
 +	    && ((bits = vesa_bios_set_dac(8)) > 6)) {
 +		error = vesa_bios_load_palette(0, 256, palette, bits);
 +		if (error == 0)
 +			return 0
 +		vesa_bios_set_dac(6);
 +	}
  
 -	return vesa_bios_load_palette(0, 256, palette);
 +	return (*prevvidsw->load_palette)(adp, palette);
  }
  
  static int

From: Ying-Chieh Liao <ijliao@dragon2.net>
To: Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
Cc: ijliao@Terry.Dorm10.NCTU.edu.tw, FreeBSD-gnats-submit@freebsd.org
Subject: Re: kern/9521: console become yellow after running X
Date: Sat, 16 Jan 1999 18:45:46 +0800

 On Sat, Jan 16, 1999 at 18:32:09 +0900, Kazutaka YOKOTA wrote:
 > Apply the following patch to /sys/i386/isa/vesa.c and rebuild the kernel
 > and /sys/modules/vesa.
 > Please report if it works for you.
 
 it works, thanks :)
 but there's some little mistakes...
 
 > @@ -779,21 +785,35 @@
 >  static int
 >  vesa_save_palette(video_adapter_t *adp, u_char *palette)
 >  {
 > -	if ((adp != vesa_adp) || !(vesa_adp_info->v_flags & V_DAC8) 
 > -	    || vesa_bios_set_dac(8))
 > -		return (*prevvidsw->save_palette)(adp, palette);
 > +	int bits;
 > +	int error;
 > +
 > +	if ((adp == vesa_adp) && (vesa_adp_info->v_flags & V_DAC8) 
 > +	    && ((bits = vesa_bios_set_dac(8)) > 6)) {
 > +		error = vesa_bios_save_palette(0, 256, palette, bits);
 > +		if (error == 0)
 > +			return 0
                                 ;
 > +		vesa_bios_set_dac(6);
 > +	}
 >  
 > -	return vesa_bios_save_palette(0, 256, palette);
 > +	return (*prevvidsw->save_palette)(adp, palette);
 >  }
 >  
 >  static int
 >  vesa_load_palette(video_adapter_t *adp, u_char *palette)
 >  {
 > -	if ((adp != vesa_adp) || !(vesa_adp_info->v_flags & V_DAC8) 
 > -	    || vesa_bios_set_dac(8))
 > -		return (*prevvidsw->load_palette)(adp, palette);
 > +	int bits;
 > +	int error;
 > +
 > +	if ((adp == vesa_adp) && (vesa_adp_info->v_flags & V_DAC8) 
 > +	    && ((bits = vesa_bios_set_dac(8)) > 6)) {
 > +		error = vesa_bios_load_palette(0, 256, palette, bits);
 > +		if (error == 0)
 > +			return 0
                                 ;
 > +		vesa_bios_set_dac(6);
 > +	}
 >  
 > -	return vesa_bios_load_palette(0, 256, palette);
 > +	return (*prevvidsw->load_palette)(adp, palette);
 >  }
 >  
 >  static int
 
 -- 
 mailto:ijliao@dragon2.net?subject="send pgp key" to get my pgp public key
 key finger print : FA 38 7E 91 FA 22 FA F6  63 04 E3 B5 A1 9F 0C CD
 
 The International Obfuscated C Code Contest 1984 winner :
 int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
 o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
State-Changed-From-To: open->closed 
State-Changed-By: yokota 
State-Changed-When: Wed Jan 27 07:10:35 PST 1999 
State-Changed-Why:  
Fixed in vesa.c rev.1.14. 
>Unformatted:
