git: 9front

Download patch

ref: df0496ee5be19da80f993b64ca8529c790cd0bbe
parent: f5b788310390df777cb0ed7d0d84a37b8e545e6f
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Wed Jun 19 22:30:17 EDT 2013

disable tscticks in pc kernel (for now)

doesnt seem to be reliable. also, separate tsc frequency measurement
and cpu loopconst measurement. turned out with *notsc=, the simplcycles()
calls would mess up loopconst.

--- a/sys/src/9/pc/archacpi.c
+++ b/sys/src/9/pc/archacpi.c
@@ -519,7 +519,5 @@
 		return 1;
 	if((cp = getconf("*nomp")) != nil && strcmp(cp, "0") != 0)
 		return 1;
-	if(m->havetsc)
-		archacpi.fastclock = tscticks;
 	return 0;
 }
--- a/sys/src/9/pc/archmp.c
+++ b/sys/src/9/pc/archmp.c
@@ -395,8 +395,5 @@
 		return 1;
 	}
 
-	if(m->havetsc)
-		archmp.fastclock = tscticks;
-
 	return 0;
 }
--- a/sys/src/9/pc/i8253.c
+++ b/sys/src/9/pc/i8253.c
@@ -145,12 +145,10 @@
 		 *
 		 */
 		outb(Tmode, Latch2);
-		cycles(&a);
 		x = inb(T2cntr);
 		x |= inb(T2cntr)<<8;
 		aamloop(loops);
 		outb(Tmode, Latch2);
-		cycles(&b);
 		y = inb(T2cntr);
 		y |= inb(T2cntr)<<8;
 
@@ -174,13 +172,25 @@
 	cpufreq = (vlong)loops*((aalcycles*2*Freq)/x);
 	m->loopconst = (cpufreq/1000)/aalcycles;	/* AAM+LOOP's for 1 ms */
 
-	/* a == b means virtualbox has confused us */
-	if(m->havetsc && b > a){
-		b -= a;
-		b *= 2*Freq;
-		b /= x;
-		m->cyclefreq = b;
-		cpufreq = b;
+	if(m->havetsc){
+		aamloop(loops);		/* warm up */
+		cycles(&a);
+		aamloop(loops);
+		cycles(&b);
+	
+		aamloop(loops);
+		cycles(&a);
+		aamloop(loops);
+		cycles(&b);
+
+		/* a == b means virtualbox has confused us */
+		if(b > a){
+			b -= a;
+			b *= 2*Freq;
+			b /= x;
+			m->cyclefreq = b;
+			cpufreq = b;
+		}
 	}
 	m->cpuhz = cpufreq;
 
--