summaryrefslogtreecommitdiff
path: root/stage3/clock.c
diff options
context:
space:
mode:
Diffstat (limited to 'stage3/clock.c')
-rw-r--r--stage3/clock.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/stage3/clock.c b/stage3/clock.c
new file mode 100644
index 0000000..372d3da
--- /dev/null
+++ b/stage3/clock.c
@@ -0,0 +1,34 @@
+#include "clock.h"
+#include "pic.h"
+#include "font.h"
+#include "io.h"
+#include "thread.h"
+#include "heap.h"
+#include "halt.h"
+
+u64 monoclock_rtc_time = 0;
+
+void clock_init()
+{
+ outb(0x70, 0x8B);
+ char prev = inb(0x71);
+ outb(0x70, 0x8B);
+ outb(0x71, prev | 0x40);
+ unmask_irq(8);
+}
+
+u64 clock_monotonic_coarse() {
+ return monoclock_rtc_time;
+}
+
+u64 clock_monotonic()
+{
+ return monoclock_rtc_time; // TODO: high resolution clock
+}
+
+u64 clock_cycles()
+{
+ u64 lo,hi;
+ asm volatile("rdtsc\n\t": "=a" (lo), "=d" (hi));
+ return lo | hi << 32;
+}