Interrupt cleanup
This commit is contained in:
parent
cbcc67fc31
commit
127d6ca5a4
@ -3,8 +3,7 @@
|
|||||||
#include <vga.h>
|
#include <vga.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <multiboot.h>
|
#include <multiboot.h>
|
||||||
|
#include <interrupts.h>
|
||||||
void interrupt_init();
|
|
||||||
|
|
||||||
void kmain(uint64_t multiboot_magic, void *multiboot_data)
|
void kmain(uint64_t multiboot_magic, void *multiboot_data)
|
||||||
{
|
{
|
||||||
|
61
src/kernel/include/interrupts.h
Normal file
61
src/kernel/include/interrupts.h
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
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();
|
@ -1,60 +1,11 @@
|
|||||||
|
#include <interrupts.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
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 int_gate_descriptor idt[NUM_INTERRUPTS];
|
||||||
struct idtr idtr;
|
struct idtr idtr;
|
||||||
|
|
||||||
|
|
||||||
extern uintptr_t isr_table[];
|
extern uintptr_t isr_table[];
|
||||||
|
|
||||||
void idt_set_gate(uint32_t num, uintptr_t vector, uint16_t cs, uint8_t ist, uint8_t flags)
|
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)
|
registers *int_handler(registers *r)
|
||||||
{
|
{
|
||||||
(void)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(;;);
|
for(;;);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user