diff options
Diffstat (limited to 'src/utils/pic.c')
| -rw-r--r-- | src/utils/pic.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/utils/pic.c b/src/utils/pic.c index 4459f0d..4806cb9 100644 --- a/src/utils/pic.c +++ b/src/utils/pic.c @@ -18,15 +18,22 @@ asm ( "movb $0x20, %al \n\t" "outb %al, $0x20 \n\t" "iret \n\t" +"PIC_IRQ_CLOCK: \n\t" + "call clock \n\t" + "movb $0x20, %al \n\t" + "outb %al, $0x20 \n\t" + "iret \n\t" ); -extern u32 PIC_IRQ_DEFAULT,PIC_IRQ_PRINT; +extern u32 PIC_IRQ_DEFAULT,PIC_IRQ_PRINT,PIC_IRQ_CLOCK; void pic_enable_interrupt(){ // Map first default 32 entries for(int i=0;i<100;i++){ pic_add_idt_entry((IDT_ENTRY){0x08,(u32)&PIC_IRQ_DEFAULT,IDT_TYPE_1},i); if(i==32) + pic_add_idt_entry((IDT_ENTRY){0x08,(u32)&PIC_IRQ_CLOCK,IDT_TYPE_1},i); + if(i==33) pic_add_idt_entry((IDT_ENTRY){0x08,(u32)&PIC_IRQ_PRINT,IDT_TYPE_1},i); } @@ -48,6 +55,10 @@ void pic_enable_interrupt(){ outbj(0x21,0x01); // Default operating mode outbj(0xA1,0x01); // Default operating mode + // OCW: Masking + outbj(0x21,0); + + asm("lidtl (IDTR)"); asm("sti"); } @@ -56,6 +67,5 @@ void pic_add_idt_entry(IDT_ENTRY entry, int id){ int descriptor[2]; descriptor[0]=entry.offset & 0xFFFF | entry.segment << 16; descriptor[1]=entry.type & 0xFFFF | entry.offset & 0xFFFF0000; - memcpy((void*)descriptor, (void *)(IDTR.base+(id*8)),8); } |
