diff options
Diffstat (limited to 'kernel/src/devices')
| -rw-r--r-- | kernel/src/devices/timer.c | 33 |
1 files changed, 32 insertions, 1 deletions
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 <timer.h> #include <libk/stdio.h> +#include <heap.h> +#include <libk/list.h> #include <io.h> 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); |
