Mercurial > lcfOS
changeset 33:d8185ddb6c7b
Added more interrupt handlers
author | windel |
---|---|
date | Sun, 15 Jan 2012 13:39:49 +0100 |
parents | 3a6a9b929db0 |
children | 8012221dd740 |
files | cos/README cos/kernel/Makefile cos/kernel/asmcode.asm cos/kernel/goto64.asm cos/kernel/handlers.c cos/kernel/kernel.c |
diffstat | 6 files changed, 105 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/cos/README Fri Jan 13 18:18:17 2012 +0100 +++ b/cos/README Sun Jan 15 13:39:49 2012 +0100 @@ -15,6 +15,7 @@ - nasm: for assembler instructions - gcc: for compiling the C sources - make: for building the system +- python: for building the initial ramdisk Enjoy!
--- a/cos/kernel/Makefile Fri Jan 13 18:18:17 2012 +0100 +++ b/cos/kernel/Makefile Sun Jan 15 13:39:49 2012 +0100 @@ -11,7 +11,7 @@ klib.o malloc.o task.o mm.o timer.o fs.o initrd.o lcfos.bin: $(CRT0) $(OBJECTS) link.ld - ld -T link.ld -s -o lcfos.bin $(CRT0) $(OBJECTS) + ld -M -T link.ld -s -o lcfos.bin $(CRT0) $(OBJECTS) %.o : %.asm nasm -f elf64 -o $@ $<
--- a/cos/kernel/asmcode.asm Fri Jan 13 18:18:17 2012 +0100 +++ b/cos/kernel/asmcode.asm Sun Jan 15 13:39:49 2012 +0100 @@ -95,9 +95,23 @@ ISR_NOERRCODE 18 ISR_NOERRCODE 19 +; irq handlers: ISR_NOERRCODE 32 ISR_NOERRCODE 33 ISR_NOERRCODE 34 +ISR_NOERRCODE 35 +ISR_NOERRCODE 36 +ISR_NOERRCODE 37 +ISR_NOERRCODE 38 +ISR_NOERRCODE 39 +ISR_NOERRCODE 40 +ISR_NOERRCODE 41 +ISR_NOERRCODE 42 +ISR_NOERRCODE 43 +ISR_NOERRCODE 44 +ISR_NOERRCODE 45 +ISR_NOERRCODE 46 +ISR_NOERRCODE 47 ; default handler: ISR_NOERRCODE 255
--- a/cos/kernel/goto64.asm Fri Jan 13 18:18:17 2012 +0100 +++ b/cos/kernel/goto64.asm Sun Jan 15 13:39:49 2012 +0100 @@ -214,6 +214,11 @@ lgdt [gdt64pointer] ; Reload GDT in 64 bits mode +; Test: +mov ax, 0x10 +mov ds, ax +; End of test + ; TODO: determine a good place for the kernel stack. mov rsp, 0xA000 ; Setup stack pointer.
--- a/cos/kernel/handlers.c Fri Jan 13 18:18:17 2012 +0100 +++ b/cos/kernel/handlers.c Sun Jan 15 13:39:49 2012 +0100 @@ -21,10 +21,23 @@ void INT17(void); void INT18(void); void INT19(void); -// Remapped handlers: +// Remapped irq assembler wrappers: void INT32(void); void INT33(void); void INT34(void); +void INT35(void); +void INT36(void); +void INT37(void); +void INT38(void); +void INT39(void); +void INT40(void); +void INT41(void); +void INT42(void); +void INT43(void); +void INT44(void); +void INT45(void); +void INT46(void); +void INT47(void); // THE interrupt descriptor table: IDT_entry *idt = (IDT_entry*)0x5000; @@ -86,6 +99,19 @@ setIDTentry(32, INT32, 0x08, 0x8F); setIDTentry(33, INT33, 0x08, 0x8F); setIDTentry(34, INT34, 0x08, 0x8F); + setIDTentry(35, INT35, 0x08, 0x8F); + setIDTentry(36, INT36, 0x08, 0x8F); + setIDTentry(37, INT37, 0x08, 0x8F); + setIDTentry(38, INT38, 0x08, 0x8F); + setIDTentry(39, INT39, 0x08, 0x8F); + setIDTentry(40, INT40, 0x08, 0x8F); + setIDTentry(41, INT41, 0x08, 0x8F); + setIDTentry(42, INT42, 0x08, 0x8F); + setIDTentry(43, INT43, 0x08, 0x8F); + setIDTentry(44, INT44, 0x08, 0x8F); + setIDTentry(45, INT45, 0x08, 0x8F); + setIDTentry(46, INT46, 0x08, 0x8F); + setIDTentry(47, INT47, 0x08, 0x8F); // Set the correct values in the IDT pointer: idtP.base = (uint64_t)idt; @@ -123,6 +149,25 @@ outb(0xA1, maskslave); } +void gp_fault(uint64_t *regs) +{ + printf("GP fault\n"); + printf("Error code: %x\n", regs[8]); + printf("RIP: %x\n", regs[9]); + panic("No resolution to general protection fault!"); +} + +void page_fault(uint64_t *regs) +{ + printf("Page fault\n"); + uint64_t faulting_address; + asm volatile("mov %%cr2, %0" : "=r" (faulting_address)); + printf("Error code: %x\n", regs[8]); + printf("RIP: %x\n", regs[9]); + printf("Faulting address: %x\n", faulting_address); + panic("No resolution to page fault!"); + +} // Global isr handler: // Hopefully, this function get called with the correct registers. @@ -139,9 +184,22 @@ { keyboardDriverUpdate(); } + else if (intnum == 13) + { + gp_fault(registers); + } + else if (intnum == 14) + { + page_fault(registers); + } + else if (intnum == 39) + { + printf("Spurious interrupt\n"); + } else { - // printf("Interrupt %d called, registers at: %x\n", registers[7], registers); + printf("Interrupt %d called, registers at: %x\n", registers[7], registers); + panic("Paniek! Unhandled interrupt!"); } // TODO: EOI to slave?
--- a/cos/kernel/kernel.c Fri Jan 13 18:18:17 2012 +0100 +++ b/cos/kernel/kernel.c Sun Jan 15 13:39:49 2012 +0100 @@ -1,4 +1,3 @@ - #include "kernel.h" static void testMalloc() @@ -27,9 +26,20 @@ uint64_t available_memory = 0; + printf("Running with %d MB ram\n", available_memory / 1000000); + + printf("Detecting amount of memory\n"); + + printf("Grub multiboot header location: %x\n", multiboot_info); + // On real hardware, the retrieval of the flags fails into general protection fault?? + + printf("Grub lower mem: %d\n", multiboot_info->mem_lower); + printf("Grub multiboot header flags: %x\n", multiboot_info->flags); + /* Display memory information from multiboot header */ if ((multiboot_info->flags & (1<<6)) == (1<<6)) { + printf("Found GRUB memory map\n"); multiboot_memory_map_t *mmap; for (mmap = (multiboot_memory_map_t*)(uint64_t)multiboot_info->mmap_addr; (uint64_t)mmap < multiboot_info->mmap_addr + multiboot_info->mmap_length; @@ -43,6 +53,10 @@ } } } + else + { + printf("Found no GRUB map\n"); + } printf("Running with %d MB ram\n", available_memory / 1000000); @@ -116,7 +130,15 @@ { magicBochsBreak(); } - } + if (strncmp(buffer, "pf", 2)) + { + /* Test general protection exception */ + uint64_t *x; + x = (uint64_t*)0x4000000; // Address that is not mapped + *x = 0x2; // trigger paging exception + } + + } }