From 8cd22309667cf3da9c357e5b7dca43e8b6a2f9c0 Mon Sep 17 00:00:00 2001 From: Danny Holman Date: Fri, 21 Jan 2022 12:10:05 -0600 Subject: arch: i386: move non-critial files out of boot Move all files not needed for the bootstrap process out of boot and into the main x86 source directory. Signed-off-by: Danny Holman --- arch/i386/kernel/pic.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 arch/i386/kernel/pic.c (limited to 'arch/i386/kernel/pic.c') diff --git a/arch/i386/kernel/pic.c b/arch/i386/kernel/pic.c new file mode 100644 index 0000000..69a0785 --- /dev/null +++ b/arch/i386/kernel/pic.c @@ -0,0 +1,67 @@ +#include + +void pic_eoi(unsigned char irq) { + if (irq >= 8) + outb(PIC2_COMMAND, 0x20); + outb(PIC1_COMMAND, 0x20); +} + +void pic_remap(void) { + unsigned char a1 = inb(PIC1_DATA); + unsigned char a2 = inb(PIC2_DATA); + + outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); + outb(PIC2_COMMAND, ICW1_INIT | ICW1_ICW4); + outb(PIC1_DATA, PIC1); + outb(PIC2_DATA, PIC2); + outb(PIC1_DATA, 4); + outb(PIC2_DATA, 2); + outb(PIC1_DATA, ICW4_8086); + outb(PIC2_DATA, ICW4_8086); + outb(PIC1_DATA, a1); + outb(PIC2_DATA, a2); +} + +static uint16_t __pic_get_irq_reg(int ocw3) { + outb(PIC1_COMMAND, ocw3); + outb(PIC2_COMMAND, ocw3); + return (inb(PIC2_COMMAND) << 8) | inb(PIC1_COMMAND); +} + +uint16_t pic_get_irr(void) { + return __pic_get_irq_reg(PIC_READ_IRR); +} + +uint16_t pic_get_isr(void) { + return __pic_get_irq_reg(PIC_READ_ISR); +} + +void irq_set_mask(uint8_t irq) { + uint16_t port; + uint8_t data; + + if (irq < 8) { + port = PIC1_DATA; + } else { + port = PIC2_DATA; + irq -= 8; + } + + data = inb(port) | (1 << irq); + outb(port, data); +} + +void irq_clear_mask(uint8_t irq) { + uint16_t port; + uint8_t data; + + if (irq < 8) { + port = PIC1_DATA; + } else { + port = PIC2_DATA; + irq -= 8; + } + + data = inb(port) & ~(1 << irq); + outb(port, data); +} -- cgit v1.2.3