void setup_idt(){ u32 i; u64 entry = IDT_ENTRY(0x8e00,cs(),(u32)udef_fun); for(i = 0;i < 256;i++) idt[i] = entry; struct gdt_ptr ptr = {sizeof(idt),(u32)idt}; asm volatile("lidtl %0"::"m"(ptr)); }
void init_8259A(){ outb(0x20,0x11); iodelay(); outb(0xa0,0x11); iodelay(); outb(0x21,0x20); iodelay(); outb(0xa1,0x28); iodelay(); outb(0x21,0x04); iodelay(); outb(0xa1,0x02); iodelay(); outb(0x21,0x01); iodelay(); outb(0xa1,0x01); iodelay(); outb(0x21,0xfe); iodelay(); outb(0xa1,0xff); iodelay(); idt[TIMER] = IDT_ENTRY(0x8e00,cs(),(u32)p); sti(); }
void idt_inicializar() { // Excepciones // llamar a IDT_ENTRY una vez por cada entrada a configurar (es una macro que no soporta loops) IDT_ENTRY(0, 0); IDT_ENTRY(1, 0); IDT_ENTRY(2, 0); IDT_ENTRY(3, 0); IDT_ENTRY(4, 0); IDT_ENTRY(5, 0); IDT_ENTRY(6, 0); IDT_ENTRY(7, 0); IDT_ENTRY(8, 0); IDT_ENTRY(9, 0); IDT_ENTRY(10, 0); IDT_ENTRY(11, 0); IDT_ENTRY(12, 0); IDT_ENTRY(13, 0); IDT_ENTRY(14, 0); IDT_ENTRY(15, 0); IDT_ENTRY(16, 0); IDT_ENTRY(17, 0); IDT_ENTRY(18, 0); IDT_ENTRY(19, 0); IDT_ENTRY(32, 0); IDT_ENTRY(33, 0); IDT_ENTRY(70, 3); }
void idt_inicializar() { // Excepciones IDT_ENTRY(0); IDT_ENTRY(1); IDT_ENTRY(2); IDT_ENTRY(3); IDT_ENTRY(4); IDT_ENTRY(5);//BOUND Range Exceeded Exception IDT_ENTRY(6); IDT_ENTRY(7); IDT_ENTRY(8);//Double Fault Exception IDT_ENTRY(9);//Coprocessor Segment Overrun IDT_ENTRY(10);//invalid TSS IDT_ENTRY(11);//Segment Not Present IDT_ENTRY(12);//Stack Fault Exception IDT_ENTRY(13); IDT_ENTRY(14); IDT_ENTRY(15); IDT_ENTRY(16); IDT_ENTRY(17); IDT_ENTRY(18); IDT_ENTRY(19); IDT_ENTRY(32); //reloj IDT_ENTRY(33); //teclado IDT_ENTRY(70); // 0x46 idt[70].attr = (unsigned short)0XEE00; //cambio el dpl }
void idt_inicializar() { // Excepciones IDT_ENTRY(0); IDT_ENTRY(1); IDT_ENTRY(2); IDT_ENTRY(3); IDT_ENTRY(4); IDT_ENTRY(5); IDT_ENTRY(6); IDT_ENTRY(7); IDT_ENTRY(8); IDT_ENTRY(9); IDT_ENTRY(10); IDT_ENTRY(11); IDT_ENTRY(12); IDT_ENTRY(13); IDT_ENTRY(14); IDT_ENTRY(15); IDT_ENTRY(16); IDT_ENTRY(17); IDT_ENTRY(18); IDT_ENTRY(19); IDT_ENTRY(32); //Reloj IDT_ENTRY(33); //Teclado IDT_ENTRY_SOFT(102); //Teclado }
(uint16_t)(((uintptr_t)(offset) >> 16) & 0xFFFF), \ (uint32_t)(((uintptr_t)(offset) >> 32) & 0xFFFFFFFF), \ 0 \ } #endif #define IDT_INTERRUPT_GATE 0xE #define IDT_TRAP_GATE 0xF #define IDT_RING0 (0 << 5) #define IDT_RING3 (3 << 5) #define IDT_PRESENT (1 << 7) extern "C" { idt_entry idt[] = { IDT_ENTRY(isr_0, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_1, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_2, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_3, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_4, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_5, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_6, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_7, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_8, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_9, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_10, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_11, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_12, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_13, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(isr_14, 0x8, IDT_INTERRUPT_GATE | IDT_RING0 | IDT_PRESENT), IDT_ENTRY(0, 0, 0),
void idt_inicializar() { // Excepciones IDT_ENTRY(0x00,0); IDT_ENTRY(0x01,0); IDT_ENTRY(0x02,0); IDT_ENTRY(0x03,0); IDT_ENTRY(0x04,0); IDT_ENTRY(0x05,0); IDT_ENTRY(0x06,0); IDT_ENTRY(0x07,0); IDT_ENTRY(0x08,0); IDT_ENTRY(0x09,0); IDT_ENTRY(0x0A,0); IDT_ENTRY(0x0B,0); IDT_ENTRY(0x0C,0); IDT_ENTRY(0x0D,0); IDT_ENTRY(0x0E,0); IDT_ENTRY(0x0F,0); IDT_ENTRY(0x10,0); IDT_ENTRY(0x11,0); IDT_ENTRY(0x12,0); IDT_ENTRY(0x13,0); IDT_ENTRY(0x20,0); IDT_ENTRY(0x21,0); IDT_ENTRY(0x46,3); // llamar a IDT_ENTRY una vez por cada entrada a configurar (es una macro que no soporta loops) }
idt[numero].segsel = (unsigned short) 0x18; /*porque hay un 18 aca??*, para decir que es el tecero de la gdt? */ \ idt[numero].attr = (unsigned short) IDT_PRESENT | IDT_USR0 | IDT_INTERRUPT | IDT_32BITS; \ idt[numero].offset_16_31 = (unsigned short) ((unsigned int)(&_isr ## numero) >> 16 /*& (unsigned int) 0xFFFF*/); /*comente el *& (unsigned int) 0xFFFF porque me arecio que no servia para nada, lo dej por si me equivoco*/ #define IDT_ENTRYUSR(numero) /*es un descriptor de interrupcion de nivel usuario*/ \ idt[numero].offset_0_15 = (unsigned short) ((unsigned int)(&_isr ## numero) /*& (unsigned int) 0xFFFF*/); \ idt[numero].segsel = (unsigned short) 0x18; /*porque hay un 18 aca?? para decir que es el tecero de la gdt? */ \ idt[numero].attr = (unsigned short) IDT_PRESENT | IDT_USR3 | IDT_INTERRUPT | IDT_32BITS; \ idt[numero].offset_16_31 = (unsigned short) ((unsigned int)(&_isr ## numero) >> 16 /*& (unsigned int) 0xFFFF*/); void idt_inicializar() { // Excepciones IDT_ENTRY(0) IDT_ENTRY(1) IDT_ENTRY(2) IDT_ENTRY(3) IDT_ENTRY(4) IDT_ENTRY(5) IDT_ENTRY(6) IDT_ENTRY(7) IDT_ENTRY(8) IDT_ENTRY(9) IDT_ENTRY(10) IDT_ENTRY(11) IDT_ENTRY(12) IDT_ENTRY(13) IDT_ENTRY(14) IDT_ENTRY(16)
void idt_inicializar() { // Excepciones IDT_ENTRY(0); IDT_ENTRY(1); IDT_ENTRY(2); IDT_ENTRY(3); IDT_ENTRY(4); IDT_ENTRY(5); IDT_ENTRY(6); IDT_ENTRY(7); IDT_ENTRY(8); IDT_ENTRY(9); IDT_ENTRY(10); IDT_ENTRY(11); IDT_ENTRY(12); IDT_ENTRY(13); IDT_ENTRY(14); IDT_ENTRY(15); IDT_ENTRY(16); IDT_ENTRY(17); IDT_ENTRY(18); IDT_ENTRY(19); IDT_ENTRY(32); IDT_ENTRY(33); IDT_ENTRY2(70); // 0x46 DPL = 11 }