diff --git a/core/interrupt.h b/core/interrupt.h index 7bef8c9..50ac724 100644 --- a/core/interrupt.h +++ b/core/interrupt.h @@ -1,13 +1,21 @@ #pragma once #include "stdarg.h" -struct interrupt_frame; -//Exception +// c.f. intel software-developer-vol-1 6.4.1 +struct interrupt_frame { + uint32_t eip; + uint32_t cs; + uint32_t eflags; + uint32_t esp; + uint32_t ss; +}; + +// Exception void print_handler(struct interrupt_frame *frame, ulong error_code); void pagefault_handler(struct interrupt_frame *frame, ulong error_code); -//IRQ +// IRQ void keyboard_handler(struct interrupt_frame *frame); void timer_handler(struct interrupt_frame *frame); void serial_handler(struct interrupt_frame *frame); diff --git a/core/main.c b/core/main.c index a1812b2..c958b59 100644 --- a/core/main.c +++ b/core/main.c @@ -70,17 +70,16 @@ void kmain(unsigned long magic, unsigned long addr) } if (CHECK_FLAG(mbi->flags, 6)) { - struct multiboot_mmap_entry *mmap = (struct multiboot_mmap_entry*)mbi->mmap_addr; + struct multiboot_mmap_entry *mmap = (struct multiboot_mmap_entry *)mbi->mmap_addr; uint size = mbi->mmap_length / sizeof(struct multiboot_mmap_entry); - printf("mmap buffer at %d size %d %d\n", mbi->mmap_addr, mbi->mmap_length, sizeof(multiboot_memory_map_t) ); - for (uint i = 0; i < size; i++){ + printf("mmap buffer at %d size %d %d\n", mbi->mmap_addr, mbi->mmap_length, + sizeof(multiboot_memory_map_t)); + for (uint i = 0; i < size; i++) { printf("base_addr_high = 0x%x, base_addr_low = 0x%x, " - "length_high = 0x%x, length_low = 0x%x, type = 0x%x\n", - (unsigned) (mmap[i].addr >> 32), - (unsigned) (mmap[i].addr & 0xffffffff), - (unsigned) (mmap[i].len >> 32), - (unsigned) (mmap[i].len & 0xffffffff), - (uint32_t)mmap[i].type); + "length_high = 0x%x, length_low = 0x%x, type = 0x%x\n", + (unsigned)(mmap[i].addr >> 32), (unsigned)(mmap[i].addr & 0xffffffff), + (unsigned)(mmap[i].len >> 32), (unsigned)(mmap[i].len & 0xffffffff), + (uint32_t)mmap[i].type); } } } @@ -100,6 +99,7 @@ void kmain(unsigned long magic, unsigned long addr) printf("Setting up IRQ handlers\n"); irqSetRoutine(IRQ_KEYBOARD, keyboard_handler); + irqSetRoutine(IRQ_TIMER, timer_handler); printf("Enabling HW interrupts\n"); exceptionSetRoutine(EXCEPTION_DOUBLE_FAULT, print_handler); diff --git a/drivers/pit.c b/drivers/pit.c index 697d76c..c600a3e 100644 --- a/drivers/pit.c +++ b/drivers/pit.c @@ -11,6 +11,5 @@ int pitSetup(unsigned int freq) outb(PIT_CHAN_0, divisor & 0xFF); outb(PIT_CHAN_0, divisor >> 8u); - irqSetRoutine(IRQ_TIMER, timer_handler); return 0; }