Call arbitrary functions from the monitor
[akaros.git] / kern / arch / i686 / ioapic.h
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * See LICENSE for details.
4  */
5
6 #ifndef ROS_KERN_IOAPIC_H
7 #define ROS_KERN_IOAPIC_H
8
9 #include <ros/common.h>
10
11 /* IOAPIC_BASE really go away. This is NOT required by the spec as far as I know.
12  * This was originally in apic.h, but Paul moved it here. This is NOT used by
13  * anything in the IOAPIC, just some other kernel stuff which uses it for
14  * size calculations. It should be called something else and moved.
15  */
16 #define IOAPIC_BASE                                     0xfec00000 // this is the default, can be changed
17
18 /* These are things like level sensitive, edge triggered, fixed, nmi, extint, etc
19  * This is based on the x58 chipset spec. There are only 2 combinations so
20  * Paul didn't bother to spell them out bit by bit and or them together.
21  */
22 #define IOAPIC_PCI_FLAGS                        0xa0
23 #define IOAPIC_ISA_FLAGS                        0x00
24 /* This says how we should treat PCI interrupts that are listed as ISA by mptables.
25  * This was determined by trial and error in the VM's. All current VMs that have this
26  * 'feature' use ISA style flags. 
27  * Author's note: Paul really hates whoever wrote the bochs bios (which is
28  * the source of this problem for bochs/kvm/qemu).
29  */
30 #define IOAPIC_BROKEN_PCI_FLAGS         IOAPIC_ISA_FLAGS 
31
32 // Obvious
33 #define IOAPIC_MAX_ID                           256
34
35 // The magic bits we write to kill unroute an irq. The 16th bit is the important one, being set to 1. 
36 // Other bits are just to restore it to a clean boot-like state.
37 #define IOAPIC_UNROUTE_LOW                      0x00010000
38 #define IOAPIC_UNROUTE_HIGH                     0x00000000
39
40 // Mem mapped register magic numbers. Oo magic!
41 #define IOAPIC_REDIRECT_OFFSET          0x10
42 #define IOAPIC_WRITE_WINDOW_OFFSET      0x10
43
44 /* Structure used to define an interrupt redirection entry. 
45  * This structure encapsulates:
46  *              An IRQ
47  *              The flags used for rerouting (edge sensitive, level triggered, etc)
48  *              Ioapic ADDR (physical Addr)
49  */
50 typedef struct IOAPICREDIRECT {
51     void*                       ioapic_address; // NULL means invalid
52         uint8_t                 ioapic_flags;
53         uint8_t                 ioapic_int;
54 } ioapic_redirect_t;
55
56 // Everyone loves a protoype.
57 void ioapic_init();
58 void ioapic_route_irq(uint8_t irq, uint8_t dest);
59 void ioapic_unroute_irq(uint8_t irq);
60
61 #endif /* ROS_KERN_IOAPIC_H */