No longer builds, but this is a good intermediate save point.
[akaros.git] / kern / arch / x86 / pic.h
1 /* Copyright (c) 2009, 2014 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * PIC: 8259 interrupt controller */
6
7 #ifndef ROS_KERN_ARCH_PIC_H
8 #define ROS_KERN_ARCH_PIC_H
9
10 #include <ros/common.h>
11
12 /* PIC (8259A)
13  * When looking at the specs, A0 is our CMD line, and A1 is the DATA line.  This
14  * means that blindly writing to PIC1_DATA is an OCW1 (interrupt masks).  When
15  * writing to CMD (A0), the chip can determine betweeb OCW2 and OCW3 by the
16  * setting of a few specific bits (OCW2 has bit 3 unset, OCW3 has it set). */
17 #define PIC1_CMD                                        0x20
18 #define PIC1_DATA                                       0x21
19 #define PIC2_CMD                                        0xA0
20 #define PIC2_DATA                                       0xA1
21 // These are also hardcoded into the IRQ_HANDLERs of kern/trapentry.S
22 #define PIC1_OFFSET                                     0x20
23 #define PIC2_OFFSET                                     0x28
24 #define PIC1_SPURIOUS                           (7 + PIC1_OFFSET)
25 #define PIC2_SPURIOUS                           (7 + PIC2_OFFSET)
26 #define PIC_EOI                                         0x20    /* OCW2 EOI */
27 /* These set the next CMD read to return specific values.  Note that the chip
28  * remembers what setting we had before (IRR or ISR), if you do other reads of
29  * CMD. (not tested, written in the spec sheet) */
30 #define PIC_READ_IRR                            0x0a    /* OCW3 irq ready next CMD read */
31 #define PIC_READ_ISR                            0x0b    /* OCW3 irq service next CMD read */
32
33 struct irq_handler;     /* include loops */
34
35 void pic_remap(void);
36 void pic_mask_irq(struct irq_handler *unused, int trap_nr);
37 void pic_unmask_irq(struct irq_handler *unused, int trap_nr);
38 void pic_mask_all(void);
39 uint16_t pic_get_mask(void);
40 uint16_t pic_get_irr(void);
41 uint16_t pic_get_isr(void);
42 bool pic_check_spurious(int trap_nr);
43 void pic_send_eoi(int trap_nr);
44
45 #endif /* ROS_KERN_ARCH_PIC_H */