summaryrefslogtreecommitdiff
path: root/stage3/interrupts.c
diff options
context:
space:
mode:
authorKimapr <kimapr@mail.ru>2023-12-20 14:51:37 +0500
committerLizzy Fleckenstein <lizzy@vlhl.dev>2023-12-21 22:54:34 +0100
commit2834bff2cf6131202a788b59a5fd81994e1ed5aa (patch)
tree9a1ace6488e16d15af474cd027f2387c91ebbc12 /stage3/interrupts.c
parent43a856b5d40ceb570af7755d9f1222093a48aa64 (diff)
downloadcuddles-2834bff2cf6131202a788b59a5fd81994e1ed5aa.tar.xz
rtc clock driver
Diffstat (limited to 'stage3/interrupts.c')
-rw-r--r--stage3/interrupts.c37
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);
}
}