diff options
Diffstat (limited to 'lume-legacy/src/kernel/timer.cc')
| -rw-r--r-- | lume-legacy/src/kernel/timer.cc | 66 |
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 |
