Mercurial > lcfOS
changeset 31:88590c42320f
Changed interrupt handler
author | windel |
---|---|
date | Tue, 10 Jan 2012 20:40:35 +0100 |
parents | 0148f55bfe24 |
children | 3a6a9b929db0 |
files | cos/kernel/asmcode.asm cos/kernel/handlers.c cos/kernel/kernel.c |
diffstat | 3 files changed, 80 insertions(+), 181 deletions(-) [+] |
line wrap: on
line diff
--- a/cos/kernel/asmcode.asm Thu Dec 29 23:51:35 2011 +0100 +++ b/cos/kernel/asmcode.asm Tue Jan 10 20:40:35 2012 +0100 @@ -18,7 +18,27 @@ lidt [idtP] ret -%macro pushAll 0 +; ISR related assembler wrappers: + +%macro ISR_NOERRCODE 1 +global INT%1 +INT%1: + cli + push strict qword 0 ; push dummy error code + push strict qword %1 ; push interrupt number + jmp isr_common_stub +%endmacro + +%macro ISR_ERRCODE 1 +global INT%1 +INT%1: + cli + push strict qword %1 ; push interrupt number + jmp isr_common_stub +%endmacro + +isr_common_stub: + ; Do some saving: push rax push rcx push rdx @@ -26,9 +46,13 @@ push rbp push rsi push rdi -%endmacro + + ; AMD64 calling convention, first parameter is in rdi: + mov rdi, rsp ; Load stack pointer into rdi to indicate where the registers on the stack are (so that we can change them!) -%macro popAll 0 + extern isr_handler + call isr_handler + pop rdi pop rsi pop rbp @@ -36,51 +60,38 @@ pop rdx pop rcx pop rax -%endmacro -; Define macro with two arguments: -%macro INTX 2 -global %1 -%1: - ; Do some saving: - cli - pushAll - ;xchg bx,bx - - extern %2 - call %2 - ; Do restoration - popAll - ;xchg bx, bx - sti - iretq - -%endmacro + add rsp, 16 ; cleanup error code and isr number + sti + iretq ; Exception handlers: -INTX INTDEF, INTDEF_handler -INTX INT0, INT0handler -INTX INT1, INT1handler -INTX INT2, INT2handler -INTX INT3, INT3handler -INTX INT4, INT4handler -INTX INT5, INT5handler -INTX INT6, INT6handler -INTX INT7, INT7handler -INTX INT8, INT8handler -INTX INT9, INT9handler -INTX INT10, INT10handler -INTX INT11, INT11handler -INTX INT12, INT12handler -INTX INT13, INT13handler -INTX INT14, INT14handler -INTX INT15, INT15handler -INTX INT16, INT16handler -INTX INT17, INT17handler -INTX INT18, INT18handler -INTX INT19, INT19handler +ISR_NOERRCODE 0 +ISR_NOERRCODE 1 +ISR_NOERRCODE 2 +ISR_NOERRCODE 3 +ISR_NOERRCODE 4 +ISR_NOERRCODE 5 +ISR_NOERRCODE 6 +ISR_NOERRCODE 7 +ISR_ERRCODE 8 +ISR_NOERRCODE 9 +ISR_ERRCODE 10 +ISR_ERRCODE 11 +ISR_ERRCODE 12 +ISR_ERRCODE 13 +ISR_ERRCODE 14 +; 15 is reserved +ISR_NOERRCODE 16 +ISR_ERRCODE 17 +ISR_NOERRCODE 18 +ISR_NOERRCODE 19 -INTX INT32, INT32handler -INTX INT33, INT33handler -INTX INT34, INT34handler +ISR_NOERRCODE 32 +ISR_NOERRCODE 33 +ISR_NOERRCODE 34 +; default handler: +ISR_NOERRCODE 255 + +
--- a/cos/kernel/handlers.c Thu Dec 29 23:51:35 2011 +0100 +++ b/cos/kernel/handlers.c Tue Jan 10 20:40:35 2012 +0100 @@ -1,7 +1,7 @@ #include "kernel.h" // Assembler wrapper prototypes: -void INTDEF(void); +void INT255(void); void INT0(void); void INT1(void); void INT2(void); @@ -17,7 +17,6 @@ void INT12(void); void INT13(void); void INT14(void); -void INT15(void); void INT16(void); void INT17(void); void INT18(void); @@ -39,8 +38,6 @@ // Typecast the function pointer to a number: offset = (uint64_t)handler; - //panic("Almost setting an IDT entry"); - // Set offset: idt[num].baseLow = offset & 0xFFFF; idt[num].baseMid = (offset >> 16) & 0xFFFF; @@ -60,7 +57,7 @@ // Fill all vectors with the default handler: for (i=0; i<256; i++) { - setIDTentry(i, INTDEF, 0x08, 0x8E); + setIDTentry(i, INT255, 0x08, 0x8E); } // Now set other then default handler: @@ -79,7 +76,7 @@ setIDTentry(12, INT12, 0x08, 0x8E); setIDTentry(13, INT13, 0x08, 0x8E); setIDTentry(14, INT14, 0x08, 0x8E); - setIDTentry(15, INT15, 0x08, 0x8E); + //setIDTentry(15, INT15, 0x08, 0x8E); setIDTentry(16, INT16, 0x08, 0x8E); setIDTentry(17, INT17, 0x08, 0x8E); setIDTentry(18, INT18, 0x08, 0x8E); @@ -126,104 +123,32 @@ outb(0xA1, maskslave); } -// Interrupt service routines: +// Global isr handler: -void INT0handler() -{ - printf("INT0 called!\n"); - panic("Unhandled exception!"); -} - -void INT1handler() +// Hopefully, this function get called with the correct registers. +void isr_handler(uint64_t* registers) { - printf("INT1 called!\n"); - panic("Unhandled exception!"); -} -void INT2handler() -{ - printf("INT2 called!\n"); - panic("Unhandled exception!"); -} + uint64_t intnum = registers[7]; -void INT3handler() -{ - printf("INT3 called!\n"); - panic("Unhandled exception!"); -} + if (intnum == 32) + { + timerDriverUpdate(); + } + else if (intnum == 33) + { + unsigned char scancode = inb(0x60); + keyboardDriverUpdate(scancode); + } + else + { + printf("Interrupt %d called, registers at: %x\n", registers[7], registers); + } -void INT4handler() -{ - printf("INT4 called!\n"); - panic("Unhandled exception!"); -} - -void INT5handler() -{ - printf("INT5 called!\n"); - panic("Unhandled exception!"); -} - -void INT6handler() -{ - printf("INT6 called!\n"); - panic("Unhandled exception!"); + outb(0x20, 0x20); // EOI to master } -void INT7handler() -{ - printf("INT7 called!\n"); - panic("Unhandled exception!"); -} - -void INT8handler() -{ - printf("INT8 called!\n"); - panic("Unhandled exception!"); -} - -void INT9handler() -{ - printf("INT9 called!\n"); - panic("Unhandled exception!"); -} - -void INT10handler() -{ - printf("INT10 called!\n"); - panic("Unhandled exception!"); -} - -void INT11handler() -{ - printf("INT11 called!\n"); - panic("Unhandled exception!"); -} - -void INT12handler() -{ - printf("INT12 called!\n"); - panic("Unhandled exception!"); -} - -void INT13handler() -{ - printf("INT13 called!\n"); - panic("Unhandled exception!"); -} - -void* getUnusedPage() -{ - return 0; -} - -void mappage(uint64_t address) { - uint32_t pageDirIndex = address >> 22; - uint32_t pageTableIndex = (address >> 12) & 0x3FF; - - printf("Allocating page at %d, tableindex=%d\n", pageDirIndex, pageTableIndex); - //uint32_t *pageTable = (uint32_t*)(pageDirectory[pageDirIndex] & 0xFFFFFC00); -} +// Interrupt service routines: void INT14handler() { @@ -235,10 +160,6 @@ asm volatile("mov %%cr2, %0" : "=r" (faulting_address)); printf("INT14 called! Page fault for address 0x%X!\n", faulting_address); - if ( (faulting_address & 0xF0000000) == 0xD0000000 ) { - mappage(faulting_address & 0xFFFFF000); - return; - } panic("Unhandled exception!"); } @@ -249,30 +170,6 @@ panic("Unhandled exception!"); } -void INT16handler() -{ - printf("INT16 called!\n"); - panic("Unhandled exception!"); -} - -void INT17handler() -{ - printf("INT17 called!\n"); - panic("Unhandled exception!"); -} - -void INT18handler() -{ - printf("INT18 called!\n"); - panic("Unhandled exception!"); -} - -void INT19handler() -{ - printf("INT19 called!\n"); - panic("Unhandled exception!"); -} - // remapped IRQ from master PIC: void INT32handler() { @@ -293,11 +190,6 @@ outb(0x20, 0x20); // EOI to master } -void INT34handler() -{ - printf("INT34 called!\n"); -} - void INTDEF_handler() { panic("Default int handler called\n");
--- a/cos/kernel/kernel.c Thu Dec 29 23:51:35 2011 +0100 +++ b/cos/kernel/kernel.c Tue Jan 10 20:40:35 2012 +0100 @@ -1,3 +1,4 @@ + #include "kernel.h" static void testMalloc() @@ -14,9 +15,6 @@ kfree(a); } -// A test program that prints 'Hoi' to the screen: -unsigned char hello_program[] = {0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, 0x48, 0xc7, 0x45, 0xf8, 0x0, 0x80, 0xb, 0x0, 0x48, 0x8b, 0x45, 0xf8, 0xc6, 0x0, 0x48, 0x48, 0x8b, 0x45, 0xf8, 0x48, 0x83, 0xc0, 0x2, 0xc6, 0x0, 0x6f, 0x48, 0x8b, 0x45, 0xf8, 0x48, 0x83, 0xc0, 0x4, 0xc6, 0x0, 0x69, 0xeb, 0xfe, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7a, 0x52, 0x0, 0x1, 0x78, 0x10, 0x1, 0x1b, 0xc, 0x7, 0x8, 0x90, 0x1, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0xb0, 0xff, 0xff, 0xff, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x41, 0xe, 0x10, 0x86, 0x2, 0x43, 0xd, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; - /* This routine initializes the kernel. * We are left here in 64-bit long mode with the first 6 MB identity mapped. * */ @@ -30,8 +28,6 @@ // TODO: get size from grub init_memory(0x1000000); - //new_task(hello_program); - // TODO: make below a user space program! printf("Welcome!\n");