From b44da1cc8773578610db2225b21c0882ad37f5a2 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Sun, 29 Jan 2023 03:24:37 +0100 Subject: timer.c: added wait_queue & wait(ms) --- kernel/src/devices/timer.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'kernel/src/devices/timer.c') diff --git a/kernel/src/devices/timer.c b/kernel/src/devices/timer.c index 1291219..09ed21c 100644 --- a/kernel/src/devices/timer.c +++ b/kernel/src/devices/timer.c @@ -1,21 +1,52 @@ #include #include +#include +#include #include uint32_t tick = 0; uint32_t seconds = 0; +struct wait_queue { + int64_t ticks; + list_t list; +}; +typedef struct wait_queue wait_queue; + +wait_queue timer_queue; + void timer_handler() { + wait_queue* pos; + list_for_each_entry(pos, (&timer_queue.list), list) { + pos->ticks--; + } + tick++; - if (tick > TICKS_PER_SECOND) { + if (tick >= TICKS_PER_SECOND) { tick = 0; seconds++; } } +void wait(uint64_t ms) +{ + __asm__ volatile ("cli;"); + wait_queue* queue = (wait_queue*)kalloc(sizeof(wait_queue)); + queue->ticks = (int64_t)ms; + add_to_list(&queue->list, &timer_queue.list, timer_queue.list.next); + __asm__ volatile ("sti;"); + + while (queue->ticks > 0) ; + + kfree(queue); + free_node(&queue->list); +} + void init_timer(uint32_t frequency) { + INIT_LIST(timer_queue.list); + uint32_t divisor = 1193180 / frequency; outb(0x43, 0x36); -- cgit v1.2.3