shithub: riscv

Download patch

ref: 17da3e3ff418849d2176a2f1ea6ef8bdbea0fa4c
parent: 8da4c8dcde68ca1da9b131cfcea917e781abf768
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;
 
--