feat(pic): add simple pic initialization

Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
This commit is contained in:
Julien CLEMENT 2021-07-21 20:30:55 +02:00
parent 51107d84c8
commit 46e8386bbf
8 changed files with 68 additions and 3 deletions

@ -33,7 +33,8 @@ OBJS = \
serial.o \ serial.o \
gdt.o \ gdt.o \
idt.o \ idt.o \
isr.o isr.o \
pic.o
DEPS = $(OBJS:.o=.d) DEPS = $(OBJS:.o=.d)

@ -35,7 +35,9 @@ static struct idt_entry_descriptor idt_entries_descriptors[IDT_NB_ENTRIES] = {
{0, {0, 0, 0}, 0}, // 28 {0, {0, 0, 0}, 0}, // 28
{0, {0, 0, 0}, 0}, // 29 {0, {0, 0, 0}, 0}, // 29
{0, {0, 0, 0}, 0}, // 30 {0, {0, 0, 0}, 0}, // 30
{0, {0, 0, 0}, 0} // 31 {0, {0, 0, 0}, 0}, // 31
{0, {0, 0, 0}, 0}, // 32
{(uint32_t)&isr_keyboard, KERNEL_CS_SEGMENT_SELECTOR, INTERRUPT_TYPE}, // 33
}; };
void interrupt_handler(struct isr_param *isr_param) void interrupt_handler(struct isr_param *isr_param)

@ -5,7 +5,8 @@
#include "gdt.h" #include "gdt.h"
#include "isr.h" #include "isr.h"
#define IDT_NB_ENTRIES 32 #define IDT_RESERVED_ENTRIES 32
#define IDT_NB_ENTRIES 34
#define IDT_SIZE (IDT_NB_ENTRIES * sizeof(struct idt_entry)) #define IDT_SIZE (IDT_NB_ENTRIES * sizeof(struct idt_entry))
#define INTERRUPT_TYPE 0x6 #define INTERRUPT_TYPE 0x6

@ -44,3 +44,4 @@ isr_callback_no_error(isr_machine_check, 18)
isr_callback_no_error(isr_simd_floating_point_exception, 19) isr_callback_no_error(isr_simd_floating_point_exception, 19)
isr_callback_no_error(isr_virtualization_exception, 20) isr_callback_no_error(isr_virtualization_exception, 20)
isr_callback_error(isr_control_protection_exception, 21) isr_callback_error(isr_control_protection_exception, 21)
isr_callback_no_error(isr_keyboard, 33)

@ -28,5 +28,6 @@ void isr_machine_check(void);
void isr_simd_floating_point_exception(void); void isr_simd_floating_point_exception(void);
void isr_virtualization_exception(void); void isr_virtualization_exception(void);
void isr_control_protection_exception(void); void isr_control_protection_exception(void);
void isr_keyboard(void);
#endif /* !ISR_H */ #endif /* !ISR_H */

2
k/k.c

@ -26,6 +26,7 @@
#include "gdt.h" #include "gdt.h"
#include "idt.h" #include "idt.h"
#include "multiboot.h" #include "multiboot.h"
#include "pic.h"
#include "serial.h" #include "serial.h"
#include "stdio.h" #include "stdio.h"
@ -34,6 +35,7 @@ static void k_init(void)
init_serial(); init_serial();
init_gdt(); init_gdt();
init_idt(); init_idt();
init_pic();
} }
void k_main(unsigned long magic, multiboot_info_t *info) void k_main(unsigned long magic, multiboot_info_t *info)

44
k/pic.c Normal file

@ -0,0 +1,44 @@
#include "idt.h"
#include "io.h"
#include "pic.h"
static void send_icw1(void)
{
outb(MASTER_PIC_A, ICW1);
outb(SLAVE_PIC_A, ICW1);
}
static void send_icw2(void)
{
outb(MASTER_PIC_B, IDT_RESERVED_ENTRIES);
outb(SLAVE_PIC_B, IDT_RESERVED_ENTRIES + 8);
}
static void send_icw3(void)
{
outb(MASTER_PIC_B, 0x4);
outb(SLAVE_PIC_B, 0x2);
}
static void send_icw4(void)
{
outb(MASTER_PIC_B, 0x1);
outb(SLAVE_PIC_B, 0x1);
}
static void mask_irqs(void)
{
outb(MASTER_PIC_B, 0xff);
outb(SLAVE_PIC_B, 0xff);
}
void init_pic(void)
{
send_icw1();
send_icw2();
send_icw3();
send_icw4();
mask_irqs();
asm volatile("sti");
}

13
k/pic.h Normal file

@ -0,0 +1,13 @@
#ifndef PIC_H
#define PIC_H
#define MASTER_PIC_A 0x20
#define MASTER_PIC_B 0x21
#define SLAVE_PIC_A 0xa0
#define SLAVE_PIC_B 0xa1
#define ICW1 0x11
void init_pic(void);
#endif /* !PIC_H */