Finished and fixed ISR+IDT

This commit is contained in:
Arnau Camprubí 2022-06-18 03:56:45 +02:00
pare f5f7b7fc73
commit 7bb5e0d16c
S'han modificat 7 arxius amb 35 adicions i 7 eliminacions

Veure arxiu

@ -7,12 +7,12 @@ typedef struct{
uint8_t reserved; uint8_t reserved;
uint8_t flags; uint8_t flags;
uint16_t base_high; uint16_t base_high;
} idt_entry; } __attribute__((packed)) idt_entry;
typedef struct{ typedef struct{
uint16_t limit; uint16_t limit;
idt_entry *ptr; idt_entry *ptr;
} idt_descriptor; } __attribute__((packed)) idt_descriptor;
idt_entry g_idt[256]; idt_entry g_idt[256];

Veure arxiu

@ -29,3 +29,8 @@ i686_outw:
mov ax, [esp + 8] mov ax, [esp + 8]
out dx, ax out dx, ax
ret ret
global i686_panic
i686_panic:
cli
hlt

Veure arxiu

@ -4,3 +4,5 @@ uint8_t __attribute__((cdecl)) i686_inb(uint16_t port);
void __attribute__((cdecl)) i686_outb(uint16_t port, uint8_t value); void __attribute__((cdecl)) i686_outb(uint16_t port, uint8_t value);
uint16_t __attribute__((cdecl)) i686_inw(uint16_t port); uint16_t __attribute__((cdecl)) i686_inw(uint16_t port);
void __attribute__((cdecl)) i686_outw(uint16_t port, uint16_t value); void __attribute__((cdecl)) i686_outw(uint16_t port, uint16_t value);
void __attribute__((cdecl)) i686_panic();

Veure arxiu

@ -1,5 +1,8 @@
#include <stddef.h>
#include "isr.h" #include "isr.h"
#include "../../stdio.h" #include "../../stdio.h"
#include "idt.h"
#include "io.h"
static isr_handler g_isr_handlers[256]; static isr_handler g_isr_handlers[256];
@ -43,11 +46,26 @@ void i686_isr_initialize_gates();
void i686_isr_initialize(){ void i686_isr_initialize(){
i686_isr_initialize_gates(); i686_isr_initialize_gates();
// Remap PIC for(int i = 0; i < 256; i++){
i686_idt_enable_gate(i);
}
} }
void i686_isr_handler(registers *regs){ void __attribute__((cdecl)) i686_isr_handler(registers *regs){
printf("Interrupt %i\n", regs->interrupt); if(g_isr_handlers[regs->interrupt] != NULL){
g_isr_handlers[regs->interrupt](regs);
}
else if(regs->interrupt >= 32){
printf("Unhandled interrupt %i\n", regs->interrupt);
}
else{
printf("Unhandled interrupt %i %s\n", regs->interrupt, g_exceptions[regs->interrupt]);
printf(" eax=%i ebx=%i ecx=%i edx=%i esi=%i edi=%i\n", regs->eax, regs->ebx, regs->ecx, regs->edx, regs->esi, regs->edi);
printf(" esp=%i ebp=%i eip=%i eflags=%i cs=%i ds=%i ss=%i\n", regs->esp, regs->ebp, regs->eip, regs->eflags, regs->cs, regs->ds, regs->ss);
printf(" interrupt=%i errorcode=%i\n", regs->interrupt, regs->error);
printf("!!! KERNEL PANIC !!!\n");
i686_panic();
}
} }
void i686_isr_register_handler(int interrupt, isr_handler handler){ void i686_isr_register_handler(int interrupt, isr_handler handler){

Veure arxiu

@ -11,7 +11,7 @@ typedef struct{
uint32_t eip, cs, eflags, esp, ss; uint32_t eip, cs, eflags, esp, ss;
} __attribute__((packed)) registers; } __attribute__((packed)) registers;
typedef void (*isr_handler)(registers regs); typedef void (*isr_handler)(registers *regs);
void i686_isr_initialize(); void i686_isr_initialize();
void i686_isr_register_handler(int interrupt, isr_handler handler); void i686_isr_register_handler(int interrupt, isr_handler handler);

Veure arxiu

@ -1,8 +1,10 @@
#include "hal.h" #include "hal.h"
#include "../arch/i686/gdt.h" #include "../arch/i686/gdt.h"
#include "../arch/i686/idt.h" #include "../arch/i686/idt.h"
#include "../arch/i686/isr.h"
void hal_initialize(){ void hal_initialize(){
i686_gdt_initialize(); i686_gdt_initialize();
i686_idt_initialize(); i686_idt_initialize();
i686_isr_initialize();
} }

Veure arxiu

@ -8,5 +8,6 @@ void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){
puts("\x1b[33mWARNING\x1b[0m"); puts("\x1b[33mWARNING\x1b[0m");
printf(": amazing %s ahead!\n", "math"); printf(": amazing %s ahead!\n", "math");
printf("%i+%i=%i\n", 1, 1, 2); printf("%i+%i=%i\n", 1, 1, 2);
for(;;); // Halt here printf("0/0=%i", 0/0);
for(;;);
} }