@@ 41,10 41,11 @@ void i8042reset(void);
void i8250console(void);
void* i8250alloc(int, int, int);
void i8250mouse(char*, int (*)(Queue*, int), int);
-void i8253init(void);
void i8253enable(void);
-void i8253timerset(uvlong);
+void i8253init(void);
+void i8253link(void);
uvlong i8253read(uvlong*);
+void i8253timerset(uvlong);
void i8259init(void);
int i8259isr(int);
int i8259enable(Vctl*);
@@ 186,6 186,7 @@ guesscpuhz(int aalcycles)
}
ulong i8253periodset;
+int i8253dotimerset = 1;
void
i8253timerset(uvlong next)
@@ 194,6 195,9 @@ i8253timerset(uvlong next)
ulong want;
ulong now;
+ if(i8253dotimerset == 0)
+ return;
+
want = next>>Tickshift;
now = i8253.ticks; /* assuming whomever called us just did fastticks() */
@@ 235,6 239,40 @@ i8253enable(void)
intrenable(IrqCLOCK, i8253clock, 0, BUSUNKNOWN, "clock");
}
+static long
+i8253timerread(Chan*, void *a, long n, vlong offset)
+{
+ if(n < 16)
+ error("need more room");
+ if(offset)
+ return 0;
+ return snprint(a, n, "timerset %s", i8253dotimerset ? "on" : "off");
+}
+
+static long
+i8253timerwrite(Chan*, void *a, long n, vlong)
+{
+ if(n==3 && memcmp(a, "off", 3) == 0){
+ i8253dotimerset = 0;
+ outb(Tmode, Load0|Square);
+ outb(T0cntr, (Freq/HZ));
+ outb(T0cntr, (Freq/HZ)>>8);
+ return n;
+ }
+ if(n==2 && memcmp(a, "on", 2) == 0){
+ i8253dotimerset = 1;
+ return n;
+ }
+ error("invalid control message");
+ return -1;
+}
+
+void
+i8253link(void)
+{
+ addarchfile("i8253timerset", 0664, i8253timerread, i8253timerwrite);
+}
+
/*
* return the total ticks of counter 1. We shift by
* 8 to give timesync more wriggle room for interpretation