diff options
author | Kimapr <kimapr@mail.ru> | 2023-12-20 14:51:37 +0500 |
---|---|---|
committer | Lizzy Fleckenstein <lizzy@vlhl.dev> | 2023-12-21 22:54:34 +0100 |
commit | 2834bff2cf6131202a788b59a5fd81994e1ed5aa (patch) | |
tree | 9a1ace6488e16d15af474cd027f2387c91ebbc12 /stage3/interrupts.c | |
parent | 43a856b5d40ceb570af7755d9f1222093a48aa64 (diff) | |
download | cuddles-2834bff2cf6131202a788b59a5fd81994e1ed5aa.tar.xz |
rtc clock driver
Diffstat (limited to 'stage3/interrupts.c')
-rw-r--r-- | stage3/interrupts.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/stage3/interrupts.c b/stage3/interrupts.c index 0a2dd6f..4d311a5 100644 --- a/stage3/interrupts.c +++ b/stage3/interrupts.c @@ -1,3 +1,4 @@ +#include "clock.h" #include "def.h" #include "halt.h" #include "font.h" @@ -195,25 +196,33 @@ void interrupt_handler(interrupt_frame *frame) dump_frame(frame); freeze(); } else if (frame->which-32 < 16) { - if (queue_write.len == queue_write.cap) { - panic(S("queue exceeded\n")); - /* - // TODO: malloc would cause a race condition - queue_write.cap = queue_write.cap == 0 ? 1 : queue_write.cap * 2; - queue_write.data = realloc(queue_write.data, queue_write.cap); - */ - } + u64 irq = frame->which-32; - event *e = &queue_write.data[queue_write.len++]; - e->irq = frame->which-32; + if (irq == 8) { + outb(0x70, 0x0C); + inb(0x71); + monoclock_rtc_time += RTC_RATE; + } else { + if (queue_write.len == queue_write.cap) { + panic(S("queue exceeded\n")); + /* + // TODO: malloc would cause a race condition + queue_write.cap = queue_write.cap == 0 ? 1 : queue_write.cap * 2; + queue_write.data = realloc(queue_write.data, queue_write.cap); + */ + } - if (e->irq == 1) { - e->data.scancode = inb(IO_PS2_DATA); + event *e = &queue_write.data[queue_write.len++]; + e->irq = irq; + + if (e->irq == 1) { + e->data.scancode = inb(IO_PS2_DATA); + } } - ack_irq(e->irq); + ack_irq(irq); } else { - // print("Spurious Interrupt "); print_num(frame->which, 10, 0); print("\n"); + // print(S("Spurious Interrupt ")); print_num(frame->which, 10); print(S("\n")); // dump_frame(frame); } } |