summaryrefslogtreecommitdiff
path: root/kernel/timer.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-07-03 20:21:59 +0200
committerAnton Kling <anton@kling.gg>2024-07-04 18:42:46 +0200
commitf7752e37ce29b903e15d2579d25d4ebbaad023e6 (patch)
tree25d5cd3d1232f8d81c2e51884c6d9dc51190ab6c /kernel/timer.c
parent6ec139d3ef7c1d2a52bb786779dd1914f125eda4 (diff)
CMOS: Make read/write calls async
This can speed up boot times since CMOS would otherwise have to wait before it could perform a read/write call. Now it gets triggered by a interrupt.
Diffstat (limited to 'kernel/timer.c')
-rw-r--r--kernel/timer.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/kernel/timer.c b/kernel/timer.c
index 46a30d3..d0ef113 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -1,17 +1,29 @@
#include <arch/i386/tsc.h>
#include <drivers/cmos.h>
#include <fs/devfs.h>
+#include <interrupts.h>
#include <math.h>
#include <time.h>
+#include <timer.h>
#include <typedefs.h>
+int has_unix_time;
i64 start_unix_time;
u64 start_tsc_time;
-void timer_init(void) {
+void timer_start_init(void) {
tsc_init();
start_tsc_time = tsc_get();
- start_unix_time = cmos_get_time();
+ enable_interrupts();
+ cmos_init();
+ cmos_start_call(1, &has_unix_time, &start_unix_time);
+ enable_interrupts();
+}
+
+void timer_wait_for_init(void) {
+ enable_interrupts();
+ for (; !has_unix_time;)
+ ;
}
u64 timer_get_uptime(void) {
@@ -55,7 +67,11 @@ int clock_write(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
i64 delta = new_value_seconds - current_unix_time_seconds;
start_unix_time += delta;
- cmos_set_time(new_value_seconds);
+ int done;
+ enable_interrupts();
+ cmos_start_call(0, &done, &new_value_seconds);
+ for (; !done;)
+ ;
return sizeof(i64);
}