aboutsummaryrefslogtreecommitdiff
path: root/src/utils/pic.c
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2021-04-08 19:06:44 +0200
committerLoic Guegan <manzerbredes@mailbox.org>2021-04-08 19:06:44 +0200
commit8fee35522dee033863f68c1d2b45f5fe988de9eb (patch)
tree5e094806066d2f13bc5ad1fefe663d132e291f8e /src/utils/pic.c
parent958e2dae042ca9e28f23e509d541730f30fa8502 (diff)
Handle clock interrupt and cleaning code
Diffstat (limited to 'src/utils/pic.c')
-rw-r--r--src/utils/pic.c14
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);
}