From 127d6ca5a4ae4d090d22a6ee0ee3e1c9746563fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Wed, 6 Dec 2017 19:53:56 +0100 Subject: [PATCH] Interrupt cleanup --- src/kernel/boot/kmain.c | 3 +- src/kernel/include/interrupts.h | 61 +++++++++++++++++++++++++++++++++ src/kernel/interrupts/idt.c | 55 +++-------------------------- 3 files changed, 66 insertions(+), 53 deletions(-) create mode 100644 src/kernel/include/interrupts.h diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index aee6cbd..605afd1 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -3,8 +3,7 @@ #include #include #include - -void interrupt_init(); +#include void kmain(uint64_t multiboot_magic, void *multiboot_data) { diff --git a/src/kernel/include/interrupts.h b/src/kernel/include/interrupts.h new file mode 100644 index 0000000..02df4f5 --- /dev/null +++ b/src/kernel/include/interrupts.h @@ -0,0 +1,61 @@ +#pragma once +#include + +struct int_gate_descriptor +{ + uint16_t base_l; + uint16_t cs; + uint8_t ist; + uint8_t flags; + uint16_t base_m; + uint32_t base_h; + uint32_t ignored; +} __attribute__((packed)); + +struct idtr +{ + uint16_t len; + struct int_gate_descriptor *addr; +} __attribute__((packed)); + +typedef struct +{ + uint64_t rax; + uint64_t rbx; + uint64_t rcx; + uint64_t rdx; + uint64_t rsi; + uint64_t rdi; + uint64_t rbp; + uint64_t r8; + uint64_t r9; + uint64_t r10; + uint64_t r11; + uint64_t r12; + uint64_t r13; + uint64_t r14; + uint64_t r15; + + uint64_t int_no; + uint64_t err_code; + + uint64_t rip; + uint64_t cs; + uint64_t rflags; + uint64_t rsp; + uint64_t ss; +} registers; + +#define debug_print_registers(r) \ +debug("RAX=%016x RBX=%016x RCX=%016x RDX=%016x\n", r->rax, r->rbx, r->rcx, r->rdx); \ +debug("RSI=%016x RDI=%016x RBP=%016x RSP=%016x\n", r->rsi, r->rdi, r->rbp, r->rsp); \ +debug("R8 =%016x R9 =%016x R10=%016x R11=%016x\n", r->r8, r->r9, r->r10, r->r11); \ +debug("R12=%016x R13=%016x R14=%016x R15=%016x\n", r->r12, r->r13, r->r14, r->r15); \ +debug("RIP=%016x RFL=%016x\n", r->rip, r->rflags); \ +debug("CS=%016x SS=%016x\n", r->cs, r->ss); + + +void load_idt(struct idtr *); + +#define NUM_INTERRUPTS 256 +void interrupt_init(); diff --git a/src/kernel/interrupts/idt.c b/src/kernel/interrupts/idt.c index 7f034a6..50b0a4a 100644 --- a/src/kernel/interrupts/idt.c +++ b/src/kernel/interrupts/idt.c @@ -1,60 +1,11 @@ +#include #include #include #include -struct int_gate_descriptor -{ - uint16_t base_l; - uint16_t cs; - uint8_t ist; - uint8_t flags; - uint16_t base_m; - uint32_t base_h; - uint32_t ignored; -} __attribute__((packed)); - -struct idtr -{ - uint16_t len; - struct int_gate_descriptor *addr; -} __attribute__((packed)); - -typedef struct -{ - uint64_t rax; - uint64_t rbx; - uint64_t rcx; - uint64_t rdx; - uint64_t rsi; - uint64_t rdi; - uint64_t rbp; - uint64_t r8; - uint64_t r9; - uint64_t r10; - uint64_t r11; - uint64_t r12; - uint64_t r13; - uint64_t r14; - uint64_t r15; - - uint64_t int_no; - uint64_t err_code; - - uint64_t rip; - uint64_t cs; - uint64_t rflags; - uint64_t rsp; - uint64_t ss; -} registers; - -void load_idt(struct idtr *); - -#define NUM_INTERRUPTS 256 - struct int_gate_descriptor idt[NUM_INTERRUPTS]; struct idtr idtr; - extern uintptr_t isr_table[]; void idt_set_gate(uint32_t num, uintptr_t vector, uint16_t cs, uint8_t ist, uint8_t flags) @@ -84,6 +35,8 @@ void interrupt_init() registers *int_handler(registers *r) { (void)r; - debug("Interrupt %d\n", r->int_no); + debug("Unhandled interrupt occurred\n"); + debug("Interrupt number: %d Error code: %d\n", r->int_no, r->err_code); + debug_print_registers(r); for(;;); }