From 42547104d6f6064d2637517c274172388cd68944 Mon Sep 17 00:00:00 2001 From: Grzegorz Suwaj Date: Mon, 23 Mar 2026 02:58:24 +0100 Subject: [PATCH 1/2] Add rough skeleton for clock controller --- include/stdbigos/clock.h | 22 +++++++++++++++++ src/example_sbi/entry.c | 44 +++++++++++++++++++++++++++++++++- src/lib/stdbigos/clock.c | 51 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 include/stdbigos/clock.h create mode 100644 src/lib/stdbigos/clock.c diff --git a/include/stdbigos/clock.h b/include/stdbigos/clock.h new file mode 100644 index 00000000..15d2ab07 --- /dev/null +++ b/include/stdbigos/clock.h @@ -0,0 +1,22 @@ +#ifndef STDBIGOS_CLOCK +#define STDBIGOS_CLOCK + +#include "sbi.h" +#include "types.h" + +/// @ingroup stdbigos +/// @{ +/// @ingroup clock +/// @{ + +u64 clock_now(void); +u64 clock_ticks(void); + +struct sbiret clock_init(u64 tick_quantum); +struct sbiret clock_rearm(void); +struct sbiret clock_on_timer_interrupt(void); + +/// @} +/// @} + +#endif // !STDBIGOS_CLOCK diff --git a/src/example_sbi/entry.c b/src/example_sbi/entry.c index 53fe6f0e..0ec1dce5 100644 --- a/src/example_sbi/entry.c +++ b/src/example_sbi/entry.c @@ -1,10 +1,52 @@ +#include +#include #include +#include #include +#include static void sbi_puts(const char* str) { while (*str) sbi_debug_console_write_byte(*str++); } +[[gnu::interrupt("supervisor")]] +static void int_handler() { + reg_t cause = CSR_READ(scause); + if (!is_interrupt(cause)) { + return; + } + + reg_t int_no = get_interrupt_code(cause); + if (int_no != IntSTimer) { + return; + } + + (void)clock_on_timer_interrupt(); +} + void main([[maybe_unused]] u32 hartid, [[maybe_unused]] const void* fdt) { - sbi_puts("Hello world\n"); + CSR_WRITE(stvec, int_handler); + + struct sbiret ret = clock_init(50000llu); + if (ret.error != SBI_SUCCESS) { + sbi_puts("clock init failed\n"); + return; + } + + CSR_SET(sie, 1lu << IntSTimer); + CSR_SET(sstatus, 1lu << 1); + + sbi_puts("clock started\n"); + + u64 last_tick = 0; + while (true) { + wfi(); + + u64 ticks = clock_ticks(); + if (ticks != last_tick && (ticks % 100) == 0) { + sbi_puts("tick x100\n"); + } + + last_tick = ticks; + } } diff --git a/src/lib/stdbigos/clock.c b/src/lib/stdbigos/clock.c new file mode 100644 index 00000000..9d8ffab3 --- /dev/null +++ b/src/lib/stdbigos/clock.c @@ -0,0 +1,51 @@ +#include +#include + +static u64 g_tick_quantum; +static u64 g_next_deadline; +static u64 g_ticks; + +static struct sbiret clock_program_timer(u64 deadline) { + struct sbiret ret = sbi_set_timer(deadline); + if (ret.error == SBI_ERR_NOT_SUPPORTED) { + return sbi_legacy_set_timer(deadline); + } + + return ret; +} + +static struct sbiret make_error(sbi_error_t error) { + return (struct sbiret){.error = error, .value = 0}; +} + +u64 clock_now(void) { + return CSR_READ(time); +} + +u64 clock_ticks(void) { + return g_ticks; +} + +struct sbiret clock_rearm(void) { + if (g_tick_quantum == 0) { + return make_error(SBI_ERR_INVALID_STATE); + } + + g_next_deadline = clock_now() + g_tick_quantum; + return clock_program_timer(g_next_deadline); +} + +struct sbiret clock_init(u64 tick_quantum) { + if (tick_quantum == 0) { + return make_error(SBI_ERR_INVALID_PARAM); + } + + g_ticks = 0; + g_tick_quantum = tick_quantum; + return clock_rearm(); +} + +struct sbiret clock_on_timer_interrupt(void) { + ++g_ticks; + return clock_rearm(); +} From 67f6d62ada71f3ef9f00cf37d4bc40a7b90e39b5 Mon Sep 17 00:00:00 2001 From: Grzegorz Suwaj Date: Mon, 23 Mar 2026 03:19:41 +0100 Subject: [PATCH 2/2] Test commit signing