forked from ReKernel/ReKernel
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpic.c
More file actions
executable file
·40 lines (35 loc) · 1.27 KB
/
Copy pathpic.c
File metadata and controls
executable file
·40 lines (35 loc) · 1.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "pic.h"
void pic_remap(void) {
/* Save masks */
uint8_t m1 = inb(PIC1_DATA), m2 = inb(PIC2_DATA);
/* ICW1: start initialisation */
outb(PIC1_CMD, 0x11); io_wait();
outb(PIC2_CMD, 0x11); io_wait();
/* ICW2: vector offsets */
outb(PIC1_DATA, 0x20); io_wait(); /* IRQ0 → int 32 */
outb(PIC2_DATA, 0x28); io_wait(); /* IRQ8 → int 40 */
/* ICW3: cascade wiring */
outb(PIC1_DATA, 0x04); io_wait(); /* PIC1 has slave on IRQ2 */
outb(PIC2_DATA, 0x02); io_wait(); /* PIC2 cascade identity = 2 */
/* ICW4: 8086 mode */
outb(PIC1_DATA, 0x01); io_wait();
outb(PIC2_DATA, 0x01); io_wait();
/* Mask ALL IRQs — drivers unmask only what they need */
(void)m1; (void)m2;
outb(PIC1_DATA, 0xFF);
outb(PIC2_DATA, 0xFF);
}
void pic_send_eoi(uint8_t irq) {
if (irq >= 8) outb(PIC2_CMD, PIC_EOI);
outb(PIC1_CMD, PIC_EOI);
}
void pic_mask_irq(uint8_t irq) {
uint16_t port = (irq < 8) ? PIC1_DATA : PIC2_DATA;
uint8_t bit = (irq < 8) ? irq : (uint8_t)(irq - 8);
outb(port, inb(port) | (uint8_t)(1 << bit));
}
void pic_unmask_irq(uint8_t irq) {
uint16_t port = (irq < 8) ? PIC1_DATA : PIC2_DATA;
uint8_t bit = (irq < 8) ? irq : (uint8_t)(irq - 8);
outb(port, inb(port) & (uint8_t)~(1 << bit));
}