summaryrefslogtreecommitdiff
path: root/lume-legacy/src/kernel/timer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lume-legacy/src/kernel/timer.cc')
-rw-r--r--lume-legacy/src/kernel/timer.cc66
1 files changed, 66 insertions, 0 deletions
diff --git a/lume-legacy/src/kernel/timer.cc b/lume-legacy/src/kernel/timer.cc
new file mode 100644
index 0000000..fc02f27
--- /dev/null
+++ b/lume-legacy/src/kernel/timer.cc
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2026 Richard QIn
+ */
+#include "common/types.h"
+#include "kernel/config.h"
+#include "kernel/spinlock.h"
+#include "kernel/proc.h"
+#include "kernel/sbi.h"
+
+#define INTERVAL 1000000
+
+namespace Timer
+{
+ uint64 ticks;
+ Spinlock tickslock;
+
+ uint64 get_time()
+ {
+ uint64 time;
+ asm volatile("rdtime %0" : "=r"(time));
+ return time;
+ }
+
+ void set_next_trigger()
+ {
+ SBI::set_timer(get_time() + INTERVAL);
+ }
+
+ void init()
+ {
+ set_next_trigger();
+
+ uint64 sie;
+ asm volatile("csrr %0, sie" : "=r"(sie));
+ sie |= (1L << 5);
+ asm volatile("csrw sie, %0" : : "r"(sie));
+ }
+
+ void tick()
+ {
+ tickslock.acquire();
+ ticks++;
+ ProcManager::wakeup(&ticks);
+ tickslock.release();
+ set_next_trigger();
+ }
+
+ uint64 get_ticks()
+ {
+ tickslock.acquire();
+ uint64 t = ticks;
+ tickslock.release();
+ return t;
+ }
+
+ Spinlock *get_lock()
+ {
+ return &tickslock;
+ }
+
+ void *get_tick_chan()
+ {
+ return &ticks;
+ }
+} \ No newline at end of file