This commit is contained in:
Justus Wolff
2026-03-26 07:19:34 +01:00
parent 983ebb281e
commit f719733428
4 changed files with 43 additions and 17 deletions

View File

@@ -39,6 +39,10 @@ typedef struct {
uint32_t int_no, err_code; uint32_t int_no, err_code;
uint32_t eip, cs, eflags, useresp, ss; uint32_t eip, cs, eflags, useresp, ss;
} INT_registers_t; } INT_registers_t;
typedef struct {
uint8_t inuse;
void* callback;
} IRQ_entry_t;
inline void PIC_sendEOI(uint8_t irq) { inline void PIC_sendEOI(uint8_t irq) {
if (irq >= 8) { // slave also needs EOI if (irq >= 8) { // slave also needs EOI
@@ -52,6 +56,7 @@ void INT_exhand(INT_registers_t regs);
void INT_IRQ(uint8_t IRQ, INT_registers_t regs); void INT_IRQ(uint8_t IRQ, INT_registers_t regs);
void idt_set_descriptor(uint8_t vector, void* isr, uint8_t flags); void idt_set_descriptor(uint8_t vector, void* isr, uint8_t flags);
void idt_init(); void idt_init();
void IRQ_registerhandler(uint8_t vector, void* callback);
__attribute__((aligned(0x10))) __attribute__((aligned(0x10)))
extern idt_entry_t idt[256]; extern idt_entry_t idt[256];
@@ -59,4 +64,5 @@ extern idtr_t idtr;
extern void* isr_stub_table[]; extern void* isr_stub_table[];
extern void* irq_stub_table[]; extern void* irq_stub_table[];
extern uint8_t INT_vectors[IDT_MAX_DESCRIPTORS]; extern uint8_t INT_vectors[IDT_MAX_DESCRIPTORS];
extern char *exception_messages[]; extern char *exception_messages[];
extern IRQ_entry_t IRQ_entries[16];

View File

@@ -73,5 +73,16 @@ void kernel_main(struct multiboot_info* header, uint32_t magic) {
asm volatile("sti"); asm volatile("sti");
kputstr("OK\n"); kputstr("OK\n");
while (1) {}
kputstr("Initializing Timer: ");
uint32_t divisor = 1193180 / 1000;
uint8_t low = (uint8_t)(divisor & 0xFF);
uint8_t high = (uint8_t)( (divisor >> 8) & 0xFF);
outb(0x43, 0x36);
outb(0x40, low);
outb(0x40, high);
kputstr("OK\n");
while (1) {}
} }

View File

@@ -40,6 +40,7 @@ char *exception_messages[] = {
"Reserved", "Reserved",
"Reserved" "Reserved"
}; };
IRQ_entry_t IRQ_entries[16];
void PIC_remap(int offset1, int offset2) { void PIC_remap(int offset1, int offset2) {
outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); // starts the initialization sequence (in cascade mode) outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); // starts the initialization sequence (in cascade mode)
@@ -72,8 +73,10 @@ void INT_exhand(INT_registers_t regs) {
strcon(msg,temp); strcon(msg,temp);
kpanic(msg); kpanic(msg);
} }
void INT_IRQ(uint8_t IRQ, INT_registers_t regs) { void INT_IRQ(INT_registers_t regs) {
if (IRQ_entries[regs.int_no].inuse) {
(void (*)(INT_registers_t))IRQ_entries[regs.int_no].callback(regs);
}
} }
void idt_init() { void idt_init() {
idtr.base = (uint32_t)&idt[0]; idtr.base = (uint32_t)&idt[0];
@@ -84,4 +87,8 @@ void idt_init() {
} }
__asm__ volatile ("lidt %0" : : "m"(idtr)); // load the new IDT __asm__ volatile ("lidt %0" : : "m"(idtr)); // load the new IDT
}
void IRQ_registerhandler(uint8_t vector, void* callback) {
IRQ_entries[vector].inuse = 1;
IRQ_entries[vector].callback = callback;
} }

View File

@@ -26,27 +26,29 @@ uint8_t uitoa32(uint32_t x, char* str) {
} }
void memcopy(void* dest, void* src, size_t size) { void memcopy(void* dest, void* src, size_t size) {
for (size_t i=0;i<size;i++) { for (size_t i=0;i<size;i++) {
((uint8_t*)dest)[i] = ((uint8_t*)src)[i]; ((uint8_t*)dest)[i] = *(uint8_t*)src++;
} }
} }
void kpanic(char* msg) { void kpanic(char* msg) {
asm volatile("cli"); asm volatile("cli");
for (uint16_t x=0;x<VGA_sizex;x++) {
for (uint16_t x=0;x<VGA_sizex;x++) {
for (uint16_t y=0;y<VGA_sizey;y++) { for (uint16_t y=0;y<VGA_sizey;y++) {
VGA_setpix(x,y,(VGA_pixel){0x00,0xFF,0x00}); VGA_setpix(x,y,(VGA_pixel){0x00,0xFF,0x00});
} }
} }
size_t x=0; size_t x=0;
size_t y=0; size_t y=0;
while (*msg != 0) { while (*msg != 0) {
if (*msg == '\n') { if (*msg == '\n') {
y ++; y ++;
x = 0; x = 0;
msg ++; msg ++;
continue; continue;
} }
_VGA_renchar(x++,y,*msg++,(uint8_t[]){0xFF,0xFF,0xFF},(uint8_t[]){0x00,0xFF,0x00}); _VGA_renchar(x++,y,*msg++,(uint8_t[]){0xFF,0xFF,0xFF},(uint8_t[]){0x00,0xFF,0x00});
} }
while (1) {} while (1) {}
} }
void memset(void* dest, size_t size, uint8_t value) { void memset(void* dest, size_t size, uint8_t value) {