summaryrefslogtreecommitdiff
path: root/stage3/clock.c
diff options
context:
space:
mode:
authorKimapr <kimapr@mail.ru>2023-12-20 14:51:37 +0500
committerLizzy Fleckenstein <lizzy@vlhl.dev>2023-12-21 22:54:34 +0100
commit2834bff2cf6131202a788b59a5fd81994e1ed5aa (patch)
tree9a1ace6488e16d15af474cd027f2387c91ebbc12 /stage3/clock.c
parent43a856b5d40ceb570af7755d9f1222093a48aa64 (diff)
downloadcuddles-2834bff2cf6131202a788b59a5fd81994e1ed5aa.tar.xz
rtc clock driver
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;
+}