summaryrefslogtreecommitdiff
path: root/kernel/drivers
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-02-09 14:08:28 +0100
committerAnton Kling <anton@kling.gg>2024-02-09 14:08:28 +0100
commita8ffc46136eb16adc87fb520c724467d1295a854 (patch)
tree2d1758a4e3c5b6ef8430c5a6b1aca7249ef7a56d /kernel/drivers
parent581ac7e072633f68deed5c5d343603c053895907 (diff)
Kernel/Interrupts: Restructure how interrupts are handeled in the kernel
Now all interrupts go through a common stub which will make certain signal handlers easier to implement
Diffstat (limited to 'kernel/drivers')
-rw-r--r--kernel/drivers/keyboard.c5
-rw-r--r--kernel/drivers/mouse.c6
-rw-r--r--kernel/drivers/pit.c10
-rw-r--r--kernel/drivers/rtl8139.c2
4 files changed, 8 insertions, 15 deletions
diff --git a/kernel/drivers/keyboard.c b/kernel/drivers/keyboard.c
index 0e3edf8..f59e6a8 100644
--- a/kernel/drivers/keyboard.c
+++ b/kernel/drivers/keyboard.c
@@ -1,4 +1,5 @@
#include <assert.h>
+#include <cpu/idt.h>
#include <drivers/keyboard.h>
#include <errno.h>
#include <fs/devfs.h>
@@ -107,8 +108,8 @@ struct KEY_EVENT {
};
extern process_t *ready_queue;
-__attribute__((interrupt)) void
-int_keyboard(__attribute__((unused)) struct interrupt_frame *frame) {
+
+void int_keyboard(reg_t *frame) {
outb(0x20, 0x20);
u16 c;
c = inb(PS2_REG_DATA);
diff --git a/kernel/drivers/mouse.c b/kernel/drivers/mouse.c
index 884b024..067f335 100644
--- a/kernel/drivers/mouse.c
+++ b/kernel/drivers/mouse.c
@@ -3,8 +3,8 @@
#include <fs/devfs.h>
#include <fs/fifo.h>
#include <fs/vfs.h>
-#include <typedefs.h>
#include <interrupts.h>
+#include <typedefs.h>
u8 mouse_cycle = 0; // unsigned char
u8 mouse_u8[3]; // signed char
@@ -45,11 +45,11 @@ void add_mouse(void) {
get_current_task()->file_descriptors[fd] = NULL;
}
-__attribute__((interrupt)) void what(registers_t *r) {
+void what(registers_t *r) {
EOI(0xe);
}
-__attribute__((interrupt)) void int_mouse(registers_t *r) {
+void int_mouse(reg_t *r) {
(void)r;
EOI(12);
switch (mouse_cycle) {
diff --git a/kernel/drivers/pit.c b/kernel/drivers/pit.c
index 8f9c35c..509f3f5 100644
--- a/kernel/drivers/pit.c
+++ b/kernel/drivers/pit.c
@@ -41,15 +41,7 @@ void set_pit_count(u16 hertz) {
outb(PIT_IO_CHANNEL_0, (divisor & 0xFF00) >> 8);
}
-__attribute__((interrupt)) void int_clock(registers_t *regs) {
- process_t *p = get_current_task();
- if (p) {
- // FIXME: For some reason eflags is the esp? I have read the
- // manual multilpe times and still can't figure out why.
- if (regs->eflags <= 0x90000000 && regs->eflags) {
- p->useresp = regs->eflags;
- }
- }
+void int_clock(reg_t regs) {
outb(0x20, 0x20);
pit_counter++;
if (pit_counter >= hertz / 1000) {
diff --git a/kernel/drivers/rtl8139.c b/kernel/drivers/rtl8139.c
index b07ccef..6e738db 100644
--- a/kernel/drivers/rtl8139.c
+++ b/kernel/drivers/rtl8139.c
@@ -90,7 +90,7 @@ void handle_packet(void) {
}
}
-__attribute__((interrupt)) void rtl8139_handler(void *regs) {
+void rtl8139_handler(void *regs) {
(void)regs;
u16 status = inw(rtl8139.gen.base_mem_io + 0x3e);