From 3487653524efc9c79e7173407446f6b83f8de81b Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sat, 22 Jun 2013 00:47:24 +0200 Subject: apic: fix lapic timer divider (fixes wrong lapic frequency on boot) loading the divider before programming one shot mode *sometimes* gives the wrong frequency. (X200s got 192Mhz vs. 266Mhz, after 5 boot attempts) also reload the divider after programming periodic mode. (from http://wiki.osdev.org/APIC_timer) --- sys/src/9/pc/apic.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sys/src/9/pc/apic.c b/sys/src/9/pc/apic.c index eada39531..4e006e8fb 100644 --- a/sys/src/9/pc/apic.c +++ b/sys/src/9/pc/apic.c @@ -124,6 +124,12 @@ lapiconline(void) lapicw(LapicTICR, lapictimer.max); lapicw(LapicTIMER, LapicCLKIN|LapicPERIODIC|(VectorPIC+IrqTIMER)); + /* + * not strickly neccesary, but reported (osdev.org) to be + * required for some machines. + */ + lapicw(LapicTDCR, lapictdxtab[lapictimer.tdx]); + lapicw(LapicTPR, 0); } @@ -134,8 +140,8 @@ static void lapictimerinit(void) { Retry: - lapicw(LapicTDCR, lapictdxtab[lapictimer.tdx]); lapicw(LapicTIMER, ApicIMASK|LapicCLKIN|LapicONESHOT|(VectorPIC+IrqTIMER)); + lapicw(LapicTDCR, lapictdxtab[lapictimer.tdx]); if(lapictimer.hz == 0ULL){ uvlong x, v, hz; -- cgit v1.2.3