diff options
| author | Aleksa Vuckovic <aleksav013@gmail.com> | 2023-01-29 03:24:37 +0100 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksav013@gmail.com> | 2023-01-29 03:26:11 +0100 |
| commit | b44da1cc8773578610db2225b21c0882ad37f5a2 (patch) | |
| tree | 41bdcc41a94630d1ff8e0196c0e119b36639d497 /kernel/src | |
| parent | 37c9560515dffebab1e0dc6b79d6ac66eff6a161 (diff) | |
timer.c: added wait_queue & wait(ms)
Diffstat (limited to 'kernel/src')
| -rw-r--r-- | kernel/src/apic/madt.c | 19 | ||||
| -rw-r--r-- | kernel/src/devices/timer.c | 33 | ||||
| -rw-r--r-- | kernel/src/main.c | 5 |
3 files changed, 47 insertions, 10 deletions
diff --git a/kernel/src/apic/madt.c b/kernel/src/apic/madt.c index 654182a..d133f2d 100644 --- a/kernel/src/apic/madt.c +++ b/kernel/src/apic/madt.c @@ -145,6 +145,16 @@ void parse_madt() } kfree(madt); + + uint8_t bspid = curr_cpu_apic_id(); + + map_addr(lapic_addr, lapic_addr, FLAG_PRESENT); + map_addr(ioapic_addr, ioapic_addr, FLAG_PRESENT); + // irq is 2 because of gsi remap + ioapic_set_irq(0x2, bspid, 0x20); // timer + ioapic_set_irq(0x1, bspid, 0x21); // keyboard + __asm__ volatile ("sti;"); + /* for(size_t i = 0; i < numcores; i++) { // do not start BSP, that's already running this code @@ -168,13 +178,4 @@ void parse_madt() } } */ - - uint8_t bspid = curr_cpu_apic_id(); - - map_addr(lapic_addr, lapic_addr, FLAG_PRESENT); - map_addr(ioapic_addr, ioapic_addr, FLAG_PRESENT); - // irq is 2 because of gsi remap - ioapic_set_irq(0x2, bspid, 0x20); // timer - ioapic_set_irq(0x1, bspid, 0x21); // keyboard - __asm__ volatile ("sti;"); } 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); diff --git a/kernel/src/main.c b/kernel/src/main.c index 5061515..6a98068 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -43,6 +43,11 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) init_tss(); list_sys_tables(); parse_madt(); + + printf("before wait\n"); + wait(10000); + printf("\nafter wait\n"); + jump_userspace(); for(;;) { |
