os/arch/i686/interrupts/interrupt.c
2024-08-11 13:40:21 +02:00

65 lines
1.4 KiB
C

#include <kernel/tty.h>
#include <stddef.h>
#include <debugging.h>
#include <kernel/io/keyboard.h>
#include "../io.h"
struct interrupt_frame {
uint32_t eflags;
uint32_t cs;
uint32_t eip;
};
uint8_t test = 'a';
static void stack_trace()
{
uint32_t* stack = 0;
asm("mov %%esp, %0" : "=r" (stack));
for (int i = 0; i < 25; i++) {
uint32_t* current_address = stack + (i * 4);
print_hex_bytes(&current_address, 4);
terminal_writestring(": ");
print_hex_bytes(current_address, 4);
terminal_putchar('\n');
}
}
__attribute__((interrupt)) void divide_by_zero(void*)
{
terminal_writestring("Yo dude u cant divide by zero yao\n");
while (1) { }
}
__attribute__((interrupt)) void general_protection_fault(void*)
{
terminal_writestring("GPF handler called\n");
while (1) { }
}
__attribute__((interrupt)) void double_fault(void*)
{
stack_trace();
terminal_writestring("2 Errors in a row, u better behave naughty naughty\n");
while (1) { }
}
__attribute__((interrupt)) void exception(void*)
{
terminal_writestring("Some weird error code stuff\n");
while (1) { }
}
__attribute__((interrupt)) void keyboard_interrupt(void*)
{
uint8_t scancode = inb(0x60);
handle_keyboard(scancode);
outb(0x20, 0x20);
}
__attribute__((interrupt)) void irq(void*)
{
outb(0x20, 0x20);
}