M pc/fns.h => pc/fns.h +1 -0
@@ 59,6 59,7 @@ void kbdinit(void);
void lgdt(ushort[3]);
void lidt(ushort[3]);
void links(void);
+void loopbackintr(void);
void ltr(ulong);
void mathinit(void);
void meminit(ulong);
M pc/i8253.c => pc/i8253.c +8 -1
@@ 124,10 124,17 @@ i8253init(int aalcycles, int havecycleclock)
}
}
+static void
+clockintr0(Ureg* ureg, void *v)
+{
+ loopbackintr();
+ clockintr(ureg, v);
+}
+
void
i8253enable(void)
{
- intrenable(IrqCLOCK, clockintr, 0, BUSUNKNOWN, "clock");
+ intrenable(IrqCLOCK, clockintr0, 0, BUSUNKNOWN, "clock");
}
/*
M port/tod.c => port/tod.c +6 -6
@@ 141,18 141,18 @@ todget(vlong *ticksp)
}
//
-// called every clock tick
+// called every clock tick to avoid calculation overflows
//
void
todfix(void)
{
- static ulong last;
+ vlong ticks, diff;
+
+ ticks = fastticks(nil);
- // once a second, make sure we don't overflow
- if(MACHP(0)->ticks - last >= HZ){
- last = MACHP(0)->ticks;
+ diff = ticks - tod.last;
+ if(diff > tod.hz)
todget(nil);
- }
}
long