summaryrefslogtreecommitdiff
path: root/kernel/src/devices/timer.c
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2023-01-29 03:24:37 +0100
committerAleksa Vuckovic <aleksav013@gmail.com>2023-01-29 03:26:11 +0100
commitb44da1cc8773578610db2225b21c0882ad37f5a2 (patch)
tree41bdcc41a94630d1ff8e0196c0e119b36639d497 /kernel/src/devices/timer.c
parent37c9560515dffebab1e0dc6b79d6ac66eff6a161 (diff)
timer.c: added wait_queue & wait(ms)
Diffstat (limited to 'kernel/src/devices/timer.c')
-rw-r--r--kernel/src/devices/timer.c33
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);