From 90cd52144aabdfb896d09454208b445ac67d6034 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 16 Jul 1998 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1998-07-16 --- pc/apic.c | 29 +++++++++++++++-------------- pc/archgeneric.c | 1 + pc/dat.h | 2 ++ pc/mp.c | 16 +++++++++------- pc/mp.h | 4 ++-- 5 files changed, 29 insertions(+), 23 deletions(-) diff --git a/pc/apic.c b/pc/apic.c index 32ca62bbfdb2ded924dd8a7352cf3e5a05f0c131..6dcae1c3053c8aa8fe89a7d1a7ec5cf83b19ad9a 100644 --- a/pc/apic.c +++ b/pc/apic.c @@ -88,6 +88,7 @@ enum { /* LapicTDCR */ }; static ulong* lapicbase; +static int clkin; static int lapicr(int r) @@ -104,7 +105,7 @@ lapicw(int r, int data) } void -lapiconline(int clkin) +lapiconline(void) { /* * Reload the timer to de-synchronise the processors, @@ -118,7 +119,7 @@ lapiconline(int clkin) lapicw(LapicTPR, 0); } -static int +static void lapictimerinit(void) { ulong lo, v; @@ -128,21 +129,23 @@ lapictimerinit(void) lapicw(LapicTDCR, LapicX1); lapicw(LapicTIMER, ApicIMASK|LapicCLKIN|LapicONESHOT|VectorTIMER); - lapicw(LapicTICR, v); - wrmsr(0x10, 0); + if(clkin == 0){ + lapicw(LapicTICR, v); + wrmsr(0x10, 0); - do{ - rdmsr(0x10, &tsc); - lo = (ulong)tsc; - }while(lo < v); + do{ + rdmsr(0x10, &tsc); + lo = (ulong)tsc; + }while(lo < v); - return ((v-lapicr(LapicTCCR)+500)/1000)*1000*1000; + clkin = ((v-lapicr(LapicTCCR)+500)/1000)*1000*1000; + } } -int +void lapicinit(Apic* apic) { - ulong clkin, r, lvt; + ulong r, lvt; if(lapicbase == 0) lapicbase = apic->addr; @@ -153,7 +156,7 @@ lapicinit(Apic* apic) lapicw(LapicTPR, 0xFF); lapicw(LapicSVR, LapicENABLE|VectorSPURIOUS); - clkin = lapictimerinit(); + lapictimerinit(); /* * Some Pentium revisions have a bug whereby spurious @@ -200,8 +203,6 @@ lapicinit(Apic* apic) * interrupts. lapicw(LapicTPR, 0); */ - - return clkin; } void diff --git a/pc/archgeneric.c b/pc/archgeneric.c index 561b33b13e17505b3734354bd5a3f63d33002a4b..657dd3b53315ca4f3e157706fcddbec536993046 100644 --- a/pc/archgeneric.c +++ b/pc/archgeneric.c @@ -210,6 +210,7 @@ static uvlong fasthz; void cycletimerinit(void) { + wrmsr(0x10, 0); fasthz = 1000000LL*m->cpumhz; } diff --git a/pc/dat.h b/pc/dat.h index 957c2325564254d62c437a7a139e1d431f624d50..f91e4d7cabd7d6faa8862738df29956650633a48 100644 --- a/pc/dat.h +++ b/pc/dat.h @@ -187,6 +187,8 @@ struct Mach vlong mtrrfix[11]; vlong mtrrvar[32]; /* 256 max. */ + vlong clockstart; /* starting value for cycle clock */ + int stack[1]; }; diff --git a/pc/mp.c b/pc/mp.c index d7f89cd52df44ec2498c14d218a30397af596f13..967afdaaeb7525f725a9fe9ca8c83070702489e0 100644 --- a/pc/mp.c +++ b/pc/mp.c @@ -354,9 +354,11 @@ checkmtrr(void) static void squidboy(Apic* apic) { - int clkin; - // iprint("Hello Squidboy\n"); + + /* synchronize cycle clocks */ + wrmsr(0x10, m->clockstart); + machinit(); mmuinit(); @@ -374,8 +376,8 @@ squidboy(Apic* apic) while(MACHP(0)->ticks == 0) ; - clkin = lapicinit(apic); - lapiconline(clkin); + lapicinit(apic); + lapiconline(); lock(&active); active.machs |= 1<machno; @@ -441,6 +443,7 @@ mpstartap(Apic* apic) *p = i>>8; nvramwrite(0x0F, 0x0A); + rdmsr(0x10, &mach->clockstart); lapicstartap(apic, PADDR(APBOOTSTRAP)); for(i = 0; i < 100000; i++){ lock(&mprdthilock); @@ -460,7 +463,6 @@ mpinit(void) PCMP *pcmp; uchar *e, *p; Apic *apic, *bpapic; - int clkin; i8259init(); @@ -529,7 +531,7 @@ mpinit(void) if(bpapic == 0) return; - clkin = lapicinit(bpapic); + lapicinit(bpapic); lock(&mprdthilock); mprdthi |= (1<apicno)<<24; unlock(&mprdthilock); @@ -542,7 +544,7 @@ mpinit(void) intrenable(VectorTIMER, clockintr, 0, BUSUNKNOWN); intrenable(VectorERROR, lapicerror, 0, BUSUNKNOWN); intrenable(VectorSPURIOUS, lapicspurious, 0, BUSUNKNOWN); - lapiconline(clkin); + lapiconline(); checkmtrr(); diff --git a/pc/mp.h b/pc/mp.h index f387548ffcef9e60881d68a3d5b3a2d9cf2de69e..8419892b58cfc735473df1a2dacb0e274325b2fe 100644 --- a/pc/mp.h +++ b/pc/mp.h @@ -210,8 +210,8 @@ enum { extern void ioapicrdtr(Apic*, int, int*, int*); extern void ioapicrdtw(Apic*, int, int, int); extern void ioapicinit(Apic*, int); -extern void lapiconline(int); -extern int lapicinit(Apic*); +extern void lapiconline(void); +extern void lapicinit(Apic*); extern void lapicstartap(Apic*, int); extern void lapicerror(Ureg*, void*); extern void lapicspurious(Ureg*, void*);