#include "interrupts.h" #include "x86.h" #include "../lib/logger/log.h" // logger facilities #define FOOLOS_MODULE_NAME "interrupts" // the interrupt descriptor table static struct int_desc { uint16_t addrLo; uint16_t sel; uint8_t zeros; uint8_t flags; uint16_t addrHi; } idt[INT_MAX]; // interrupt descriptor table descriptor static struct idt_desc { uint16_t size; uint16_t baseLo; uint16_t baseHi; } idtd; // disable interrupts void int_disable() { __asm__("cli"); } // enable interrupts void int_enable() { __asm__("sti"); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"up and running"); } void int_generate88() { __asm__("int $88"); } void int_def_handler() { X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"unhandled EXCEPTION!"); X86_IRQ_END } //set a handler for a specific interrupt void int_install_ir(int irq, uint16_t flags, uint16_t sel, void *addr) { uint64_t base=(uint64_t)&(*addr); // TODO! idt[irq].addrLo = base & 0xffff; idt[irq].addrHi = (base >> 16) & 0xffff; idt[irq].addrHi = 0x0; idt[irq].zeros=0; idt[irq].flags=flags; idt[irq].sel=sel; } // set default handler for all interrupts for a start void int_init(uint16_t sel) { int i; for(i=0; i "); print_hex(*(ptr3+offset*4)); //addrLo print_hex(*(ptr3+1+offset*4)); //sel print_hex(*(ptr3+2+offset*4)); //zeros & flags print_hex(*(ptr3+3+offset*4)); //addrHi print_nextline(); } } */