Fixes spin_trylock()
[akaros.git] / kern / arch / x86 / 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 /* Physical address of the IOAPIC, can be changed.  Currently, it's mapped at
12  * the VADDR IOAPIC_BASE */
13 #define IOAPIC_PBASE                            0xfec00000 /* default *physical* address */
14
15 /* These are things like level sensitive, edge triggered, fixed, nmi, extint, etc
16  * This is based on the x58 chipset spec. There are only 2 combinations so
17  * Paul didn't bother to spell them out bit by bit and or them together.
18  */
19 #define IOAPIC_PCI_FLAGS                        0xa0
20 #define IOAPIC_ISA_FLAGS                        0x00
21 /* This says how we should treat PCI interrupts that are listed as ISA by mptables.
22  * This was determined by trial and error in the VM's. All current VMs that have this
23  * 'feature' use ISA style flags. 
24  * Author's note: Paul really hates whoever wrote the bochs bios (which is
25  * the source of this problem for bochs/kvm/qemu).
26  */
27 #define IOAPIC_BROKEN_PCI_FLAGS         IOAPIC_ISA_FLAGS 
28
29 // Obvious
30 #define IOAPIC_MAX_ID                           256
31
32 // The magic bits we write to kill unroute an irq. The 16th bit is the important one, being set to 1. 
33 // Other bits are just to restore it to a clean boot-like state.
34 #define IOAPIC_UNROUTE_LOW                      0x00010000
35 #define IOAPIC_UNROUTE_HIGH                     0x00000000
36
37 // Mem mapped register magic numbers. Oo magic!
38 #define IOAPIC_REDIRECT_OFFSET          0x10
39 #define IOAPIC_WRITE_WINDOW_OFFSET      0x10
40
41 /* Structure used to define an interrupt redirection entry. 
42  * This structure encapsulates:
43  *              An IRQ
44  *              The flags used for rerouting (edge sensitive, level triggered, etc)
45  *              Ioapic ADDR (physical Addr)
46  */
47 typedef struct IOAPICREDIRECT {
48     uintptr_t           ioapic_address; /* 0 means invalid */
49         uint8_t                 ioapic_flags;
50         uint8_t                 ioapic_int;
51 } ioapic_redirect_t;
52
53 // Everyone loves a protoype.
54 void ioapic_init();
55 void ioapic_route_irq(uint8_t irq, uint8_t dest);
56 void ioapic_unroute_irq(uint8_t irq);
57
58 #endif /* ROS_KERN_IOAPIC_H */