diff options
Diffstat (limited to 'src/int')
| -rw-r--r-- | src/int/8042.c | 4 | ||||
| -rw-r--r-- | src/int/8042.h | 2 | ||||
| -rw-r--r-- | src/int/idt.c | 39 | ||||
| -rw-r--r-- | src/int/idt.h | 32 | ||||
| -rw-r--r-- | src/int/int.S | 72 | ||||
| -rw-r--r-- | src/int/pic.c | 99 | ||||
| -rw-r--r-- | src/int/pic.h | 22 |
7 files changed, 156 insertions, 114 deletions
diff --git a/src/int/8042.c b/src/int/8042.c index f0a987f..5446f11 100644 --- a/src/int/8042.c +++ b/src/int/8042.c @@ -1,6 +1,6 @@ #include "8042.h" -#include "utils/framebuffer.h" -#include "utils/asm.h" +#include "core/framebuffer.h" +#include "core/asm.h" DEFINE_AZERTY; diff --git a/src/int/8042.h b/src/int/8042.h index e35e5a0..5e61ffd 100644 --- a/src/int/8042.h +++ b/src/int/8042.h @@ -1,7 +1,7 @@ #ifndef _8042_H #define _8042_H -#include "utils/types.h" +#include "core/types.h" void _8042_keypress(); diff --git a/src/int/idt.c b/src/int/idt.c new file mode 100644 index 0000000..e3e71e8 --- /dev/null +++ b/src/int/idt.c @@ -0,0 +1,39 @@ +#include "idt.h" + +struct IDT_REGISTER IDTR={ + 8*IDT_MAX_ENTRY, + 0x0 +}; + +// Interrupt functions (cf int.S) +extern u32 +INT_DEFAULT, +INT_PAGE_FAULT, +INT_CLOCK, +INT_KEYPRESS, +INT_SYSCALL; + + +void idt_init(){ + // Map first default 32 entries + for(int i=0;i<IDT_MAX_ENTRY;i++){ + idt_write_entry((IDT_ENTRY){0x08,(u32)&INT_DEFAULT,IDT_INT_GATE},i); + if(i==14) + idt_write_entry((IDT_ENTRY){0x08,(u32)&INT_PAGE_FAULT,IDT_INT_GATE},i); + if(i==32) + idt_write_entry((IDT_ENTRY){0x08,(u32)&INT_CLOCK,IDT_INT_GATE},i); + if(i==33) + idt_write_entry((IDT_ENTRY){0x08,(u32)&INT_KEYPRESS,IDT_INT_GATE},i); + if(i==48) + idt_write_entry((IDT_ENTRY){0x08,(u32)&INT_SYSCALL,IDT_TRAP_GATE},i); + } + + asm("lidtl (IDTR)"); +} + +void idt_write_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); +}
\ No newline at end of file diff --git a/src/int/idt.h b/src/int/idt.h new file mode 100644 index 0000000..17c5cfa --- /dev/null +++ b/src/int/idt.h @@ -0,0 +1,32 @@ +#ifndef IDT_H +#define IDT_H + +#include "core/types.h" +#include "core/mem.h" + +#define IDT_MAX_ENTRY 200 +#define IDT_INT_GATE 0x8E00 +#define IDT_TRAP_GATE 0xEF00 + +typedef struct IDT_ENTRY { + u16 segment; + u32 offset; + u16 type; +} IDT_ENTRY; + +struct IDT_REGISTER { + u16 limit; + u32 base; +} __attribute__((packed)); + +/** + * Copy IDT into memory and load it + */ +void idt_init(); + +/** + * Write an IDT entry into memory + */ +void idt_write_entry(IDT_ENTRY entry,int id); + +#endif
\ No newline at end of file diff --git a/src/int/int.S b/src/int/int.S index e69de29..8ca8b7a 100644 --- a/src/int/int.S +++ b/src/int/int.S @@ -0,0 +1,72 @@ +.macro SAVE_REGS +pushal +push %ds +push %es +push %fs +push %gs +push %ebx +mov $0x10,%bx +mov %bx,%ds +pop %ebx +.endm + +.macro RESTORE_REGS + pop %gs + pop %fs + pop %es + pop %ds + popal +.endm + +.globl interrupt_enable +interrupt_enable: + call idt_init + call pic_init + sti + ret + +.globl INT_DEFAULT +INT_DEFAULT: + SAVE_REGS + movb $0x20, %al + outb %al, $0x20 + RESTORE_REGS + iret + +.globl INT_KEYPRESS +INT_KEYPRESS: + SAVE_REGS + call _8042_keypress + movb $0x20, %al + outb %al, $0x20 + RESTORE_REGS + iret + +.globl INT_CLOCK +INT_CLOCK: + SAVE_REGS + call clock + movb $0x20, %al + outb %al, $0x20 + RESTORE_REGS + iret + +.globl INT_SYSCALL +INT_SYSCALL: + SAVE_REGS + call syscall + movb $0x20, %al + outb %al, $0x20 + RESTORE_REGS + iret + +.globl INT_PAGE_FAULT +INT_PAGE_FAULT: + SAVE_REGS + call page_fault + hlt + movb $0x20, %al + outb %al, $0x20 + RESTORE_REGS + iret + diff --git a/src/int/pic.c b/src/int/pic.c index 472e50c..d509e1d 100644 --- a/src/int/pic.c +++ b/src/int/pic.c @@ -1,88 +1,10 @@ #include "pic.h" -#include "utils/asm.h" -#include "utils/mem.h" -#include "utils/syscall.h" - -struct IDT_REGISTER IDTR={ - 200*8, - 0x0 -}; - -/// Bridge between IDT and functions call -asm ( -".macro SAVE_REGS \n\t" - "pushal \n\t" - "push %ds \n\t" - "push %es \n\t" - "push %fs \n\t" - "push %gs \n\t" - "push %ebx \n\t" - "mov $0x10,%bx \n\t" - "mov %bx,%ds \n\t" - "pop %ebx \n\t" -".endm \n\t" -".macro RESTORE_REGS \n\t" - "pop %gs \n\t" - "pop %fs \n\t" - "pop %es \n\t" - "pop %ds \n\t" - "popal \n\t" -".endm \n\t" -"PIC_IRQ_DEFAULT: \n\t" - "SAVE_REGS \n\t" - "movb $0x20, %al \n\t" - "outb %al, $0x20 \n\t" - "RESTORE_REGS \n\t" - "iret \n\t" -"PIC_IRQ_PRINT: \n\t" - "SAVE_REGS \n\t" - "call _8042_keypress \n\t" - "movb $0x20, %al \n\t" - "outb %al, $0x20 \n\t" - "RESTORE_REGS \n\t" - "iret \n\t" -"PIC_IRQ_CLOCK: \n\t" - "SAVE_REGS \n\t" - "call clock \n\t" - "movb $0x20, %al \n\t" - "outb %al, $0x20 \n\t" - "RESTORE_REGS \n\t" - "iret \n\t" -"PIC_IRQ_SYSCALL: \n\t" - "SAVE_REGS \n\t" - "call syscall \n\t" - "movb $0x20, %al \n\t" - "outb %al, $0x20 \n\t" - "RESTORE_REGS \n\t" - "iret \n\t" -"INT_PAGE_FAULT: \n\t" - "SAVE_REGS \n\t" - "call page_fault \n\t" - "hlt \n\t" - "movb $0x20, %al \n\t" - "outb %al, $0x20 \n\t" - "RESTORE_REGS \n\t" - "iret \n\t" -); - -extern u32 PIC_IRQ_DEFAULT,PIC_IRQ_PRINT,PIC_IRQ_CLOCK, PIC_IRQ_SYSCALL,INT_PAGE_FAULT; - -void pic_enable_interrupt(){ - // Map first default 32 entries - for(int i=0;i<200;i++){ - pic_add_idt_entry((IDT_ENTRY){0x08,(u32)&PIC_IRQ_DEFAULT,IDT_INT_GATE},i); - if(i==14) - pic_add_idt_entry((IDT_ENTRY){0x08,(u32)&INT_PAGE_FAULT,IDT_INT_GATE},i); - if(i==32) - pic_add_idt_entry((IDT_ENTRY){0x08,(u32)&PIC_IRQ_CLOCK,IDT_INT_GATE},i); - if(i==33) - pic_add_idt_entry((IDT_ENTRY){0x08,(u32)&PIC_IRQ_PRINT,IDT_INT_GATE},i); - if(i==48) - pic_add_idt_entry((IDT_ENTRY){0x08,(u32)&PIC_IRQ_SYSCALL,IDT_TRAP_GATE},i); - } - - // Now configure 8952A +#include "core/asm.h" +#include "core/mem.h" +#include "core/syscall.h" +void pic_init(){ + // ICW1: Initialisation outbj(0x20,0x11); // Master outbj(0xA0,0x11); // Slave @@ -101,15 +23,6 @@ void pic_enable_interrupt(){ // OCW: Masking outbj(0x21,0b11111100); - - - asm("lidtl (IDTR)"); - asm("sti"); } -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); -} + diff --git a/src/int/pic.h b/src/int/pic.h index db1ccec..19e0f5c 100644 --- a/src/int/pic.h +++ b/src/int/pic.h @@ -1,23 +1,9 @@ #ifndef PIC_H #define PIC_H -#include "utils/types.h" - -#define IDT_INT_GATE 0x8E00 -#define IDT_TRAP_GATE 0xEF00 - -typedef struct IDT_ENTRY { - u16 segment; - u32 offset; - u16 type; -} IDT_ENTRY; - -struct IDT_REGISTER { - u16 limit; - u32 base; -} __attribute__((packed)); - -void pic_enable_interrupt(); -void pic_add_idt_entry(IDT_ENTRY entry,int id); +/** + * Configure + */ +void pic_init(); #endif
\ No newline at end of file |
