Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 8 Feb 2006 02:01:42 +0300
From:      Yar Tikhiy <yar@comp.chem.msu.su>
To:        Cy Schubert <Cy.Schubert@spqr.komquats.com>
Cc:        freebsd-current@freebsd.org, netchild@freebsd.org
Subject:   Re: 7.0-CURRENT Hang
Message-ID:  <20060207230142.GD32998@comp.chem.msu.su>
In-Reply-To: <200602071834.k17IYGcv036104@cwsys.cwsent.com>
References:  <20060207182755.GB32998@comp.chem.msu.su> <200602071834.k17IYGcv036104@cwsys.cwsent.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Feb 07, 2006 at 10:34:16AM -0800, Cy Schubert wrote:
> In message <20060207182755.GB32998@comp.chem.msu.su>, Yar Tikhiy writes:
> > On Tue, Feb 07, 2006 at 10:06:32AM -0800, Cy Schubert wrote:
> > > In message <20060207173154.GE19674@comp.chem.msu.su>, Yar Tikhiy writes:
> > > > On Mon, Feb 06, 2006 at 08:29:35PM -0800, Cy Schubert wrote:
> 
> cwtest# /usr/local/bin/cpuid
>  eax in    eax      ebx      ecx      edx
> 00000000 00000001 756e6547 6c65746e 49656e69
                 ^^
> 00000001 0000052c 00000000 00000000 000001bf

Thanks for getting these data!  They tell that your CPU doesn't
support CPUID functions above 0x01, which is completely OK for
a Pentium.

Would you mind giving a try to the attached patch?  It should fix
the CPUID 0x02 issue while reducing code duplication.

-- 
Yar

Index: identcpu.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/identcpu.c,v
retrieving revision 1.157
diff -u -p -r1.157 identcpu.c
--- identcpu.c	2 Feb 2006 12:44:09 -0000	1.157
+++ identcpu.c	7 Feb 2006 22:42:13 -0000
@@ -1235,34 +1235,23 @@ print_INTEL_info(void)
 	u_int rounds, regnum;
 	u_int nwaycode, nway;
 
-	do_cpuid(0x2, regs);
-
-	rounds = (regs[0] & 0xff) - 1;
-
-	for (regnum = 0; regnum <= 3; ++regnum) {
-		if ((regs[regnum] & (1<<31)) == 0) {
-			if (regnum != 0)
-				print_INTEL_TLB(regs[regnum] & 0xff);
-			print_INTEL_TLB((regs[regnum] >> 8) & 0xff);
-			print_INTEL_TLB((regs[regnum] >> 16) & 0xff);
-			print_INTEL_TLB((regs[regnum] >> 24) & 0xff);
-		}
-	}
-
-	while (rounds > 0) {
-		do_cpuid(0x2, regs);
-
-		for (regnum = 0; regnum <= 3; ++regnum) {
-			if ((regs[regnum] & (1<<31)) == 0) {
+	if (cpu_high >= 2) {
+		rounds = 0;
+		do {
+			do_cpuid(0x2, regs);
+			if (rounds == 0 && (rounds = (regs[0] & 0xff)) == 0)
+				break;	/* we have a buggy CPU */
+
+			for (regnum = 0; regnum <= 3; ++regnum) {
+				if (regs[regnum] & (1<<31))
+					continue;
 				if (regnum != 0)
 					print_INTEL_TLB(regs[regnum] & 0xff);
 				print_INTEL_TLB((regs[regnum] >> 8) & 0xff);
 				print_INTEL_TLB((regs[regnum] >> 16) & 0xff);
 				print_INTEL_TLB((regs[regnum] >> 24) & 0xff);
 			}
-		}
-
-		--rounds;
+		} while (--rounds > 0);
 	}
 
 	if (cpu_exthigh >= 0x80000006) {
@@ -1451,28 +1440,16 @@ setPQL2_INTEL(int *const size, int *cons
 	u_int regs[4];
 	u_int nwaycode;
 
-	do_cpuid(0x2, regs);
-	rounds = (regs[0] & 0xff) - 1;
-
-	for (regnum = 0; regnum <= 3; ++regnum) {
-		if ((regs[regnum] & (1<<31)) == 0) {
-			if (regnum != 0)
-				get_INTEL_TLB(regs[regnum] & 0xff,
-				    size, ways);
-			get_INTEL_TLB((regs[regnum] >> 8) & 0xff,
-			    size, ways);
-			get_INTEL_TLB((regs[regnum] >> 16) & 0xff,
-			    size, ways);
-			get_INTEL_TLB((regs[regnum] >> 24) & 0xff,
-			    size, ways);
-		}
-	}
-
-	while (rounds > 0) {
-		do_cpuid(0x2, regs);
-
-		for (regnum = 0; regnum <= 3; ++regnum) {
-			if ((regs[regnum] & (1<<31)) == 0) {
+	if (cpu_high >= 2) {
+		rounds = 0;
+		do {
+			do_cpuid(0x2, regs);
+			if (rounds == 0 && (rounds = (regs[0] & 0xff)) == 0)
+				break;	/* we have a buggy CPU */
+
+			for (regnum = 0; regnum <= 3; ++regnum) {
+				if (regs[regnum] & (1<<31))
+					continue;
 				if (regnum != 0)
 					get_INTEL_TLB(regs[regnum] & 0xff,
 					    size, ways);
@@ -1482,11 +1459,9 @@ setPQL2_INTEL(int *const size, int *cons
 				    size, ways);
 				get_INTEL_TLB((regs[regnum] >> 24) & 0xff,
 				    size, ways);
-                        }
-                }
-
-                --rounds;
-        }
+			}
+		} while (--rounds > 0);
+	}
 
 	if (cpu_exthigh >= 0x80000006) {
 		do_cpuid(0x80000006, regs);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060207230142.GD32998>