From f7752e37ce29b903e15d2579d25d4ebbaad023e6 Mon Sep 17 00:00:00 2001 From: Anton Kling Date: Wed, 3 Jul 2024 20:21:59 +0200 Subject: 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. --- kernel/timer.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'kernel/timer.c') 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 #include #include +#include #include #include +#include #include +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); } -- cgit v1.2.3