M pc/apic.c => pc/apic.c +0 -3
@@ 343,8 343,6 @@ ioapicinit(Apic* apic, int apicno)
ioapicrdtw(apic, v, hi, lo);
}
-ulong lapicperiodset[32];
-
void
lapictimerset(uvlong next)
{
@@ 366,7 364,6 @@ lapictimerset(uvlong next)
}
lapicw(LapicTICR, period);
- lapicperiodset[m->machno]++;
unlock(&m->apictimerlock);
splx(x);
M pc/archmp.c => pc/archmp.c +36 -1
@@ 89,12 89,47 @@ identify(void)
return 0;
}
+Lock mpsynclock;
+
+void
+syncclock(void)
+{
+ uvlong x;
+
+ if(m->machno == 0){
+ wrmsr(0x10, 0);
+ m->tscticks = 0;
+ m->tscoff = 0;
+ } else {
+ x = MACHP(0)->tscticks;
+ while(x == MACHP(0)->tscticks)
+ ;
+ m->tscoff = MACHP(0)->tscticks;
+ wrmsr(0x10, 0);
+ m->tscticks = 0;
+ }
+}
+
+uvlong
+tscticks(uvlong *hz)
+{
+ uvlong t;
+
+ if(hz != nil)
+ *hz = m->cpuhz;
+
+ rdtsc(&t);
+ m->tscticks = t;
+
+ return t+m->tscoff;
+}
+
PCArch archmp = {
.id= "_MP_",
.ident= identify,
.reset= mpshutdown,
.intrinit= mpinit,
.intrenable= mpintrenable,
-.fastclock= i8253read,
+.fastclock= tscticks,
.timerset= lapictimerset,
};
M pc/dat.h => pc/dat.h +3 -1
@@ 185,13 185,15 @@ struct Mach
Lock apictimerlock;
int cpumhz;
- vlong cpuhz;
+ uvlong cpuhz;
int cpuidax;
int cpuiddx;
char cpuidid[16];
char* cpuidtype;
int havetsc;
int havepge;
+ uvlong tscticks;
+ uvlong tscoff;
vlong mtrrcap;
vlong mtrrdef;
M pc/fns.h => pc/fns.h +2 -1
@@ 121,11 121,12 @@ void procsetup(Proc*);
void putcr3(ulong);
void putcr4(ulong);
void rdmsr(int, vlong*);
-void rdtsc(vlong*);
+void rdtsc(uvlong*);
void screeninit(void);
int screenprint(char*, ...); /* debugging */
void (*screenputs)(char*, int);
void sfence(void);
+void syncclock(void);
void touser(void*);
void trapenable(int, void (*)(Ureg*, void*), void*, char*);
void trapinit(void);
M pc/i8253.c => pc/i8253.c +1 -1
@@ 116,7 116,7 @@ void
guesscpuhz(int aalcycles)
{
int cpufreq, loops, incr, x, y;
- vlong a, b;
+ uvlong a, b;
/* find biggest loop that doesn't wrap */
incr = 16000000/(aalcycles*HZ*2);
M pc/mp.c => pc/mp.c +2 -0
@@ 365,6 365,7 @@ squidboy(Apic* apic)
lapicinit(apic);
lapiconline();
+ syncclock();
timersinit();
lock(&active);
@@ 460,6 461,7 @@ mpinit(void)
Apic *apic, *bpapic;
i8259init();
+ syncclock();
if(_mp_ == 0)
return;
M port/proc.c => port/proc.c +2 -1
@@ 263,7 263,7 @@ found:
l = 0;
for(p = rq->head; p; p = p->rnext){
- if(p->mp == MACHP(m->machno) || p->movetime < MACHP(0)->ticks)
+ if(p->mp == MACHP(m->machno) || p->movetime <= MACHP(0)->ticks)
break;
l = p;
}
@@ 359,6 359,7 @@ newproc(void)
p->errbuf1[0] = '\0';
p->nlocks = 0;
p->delaysched = 0;
+ p->movetime = 0;
kstrdup(&p->user, "*nouser");
kstrdup(&p->text, "*notext");
kstrdup(&p->args, "");