Changes ARCH i686 -> x86 (XCC)
[akaros.git] / kern / arch / x86 / mptables.h
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * See LICENSE for details.
4  */
5
6 #ifndef ROS_INC_MPTABLES_H
7 #define ROS_INC_MPTABLES_H
8
9 #include <ros/common.h>
10 #include <pmap.h>
11
12 /* 
13  * LICENCE NOTE: Most of these structures and some constants
14  * were blatently ripped out of BSD with <3. Only the camel 
15  * casing has been changed to protect the innocent.
16  */
17
18 // OBSCENELY IMPORTANT NOTE: None of this is packed. I didn't do it because BSD didnt. This may need to change
19
20 #define mptables_info(...)  printk(__VA_ARGS__)  
21 #define mptables_dump(...)  //printk(__VA_ARGS__)  
22
23 // The HEX representation of the ascii string _MP_ we search for
24 #define MP_SIG                          0x5f504d5f      /* _MP_ */
25
26 // Base and (inclusive bound) of the BIOS region to check
27 #define BIOS_ROM_BASE           0xf0000
28 #define BIOS_ROM_BOUND          0xffff0 
29
30 // Where to look for the EBDA pointer
31 // Bound is dynamic. In first KB
32 #define EBDA_POINTER            0x040e 
33 #define EBDA_SIZE                       1024
34
35 /* BIOS: base memory size */
36 #define TOPOFMEM_POINTER        0x0413          
37 #define IMCRP_MASK                      0x80
38
39 // Sometimes the BIOS is a lying pain in my ass
40 // so don't believe it and assume this top of memory and check it
41 #define DEFAULT_TOPOFMEM        0xa0000
42
43 // How many entry types exist? Won't ever change
44 #define NUM_ENTRY_TYPES         5
45
46 #define INVALID_DEST_APIC       0xffff
47
48 #define MPFPS_SIZE                      16 // For ivy
49 #define MPCTH_SIZE                      44
50
51 // Sorry Zach, this has to be done.
52 #define READ_FROM_STORED_PHYSADDR32(addr)  READ_FROM_STORED_VIRTADDR32(KADDR(addr))
53 #define READ_FROM_STORED_VIRTADDR32(addr)  *((uint32_t* SAFE)addr)
54
55
56 enum interrupt_modes {
57         PIC, // PIC Mode 
58         VW,  // Virtural Wire Mode (Dev Boxes)
59         SIO  // Once we fix up the ioapic, shift to this mode (not currently used)
60 };
61
62 // Start BSDs lovingly barrowed structs/etc
63
64 enum entry_types {
65         PROC =          0,
66         BUS  =          1,
67         IOAPIC =        2,
68         INT =           3,
69         LINT =          4
70 };
71
72 enum bus_types {
73     CBUS = 1,
74     CBUSII = 2,
75     EISA = 3,
76     ISA = 6,
77     PCI = 13,
78     XPRESS = 18,
79     MAX_BUSTYPE = 18,
80     UNKNOWN_BUSTYPE = 0xff
81 };
82
83 typedef struct BUSTYPENAME {
84     uint8_t     type;
85     char        name[ 7 ];
86 } bus_type_name_t;
87
88 static bus_type_name_t bus_type_table[] =
89 {
90     { CBUS,             "CBUS"   },
91     { CBUSII,           "CBUSII" },
92     { EISA,             "EISA"   },
93     { UNKNOWN_BUSTYPE,  "---"    },
94     { UNKNOWN_BUSTYPE,  "---"    },
95     { ISA,              "ISA"    },
96     { UNKNOWN_BUSTYPE,  "---"    },
97     { UNKNOWN_BUSTYPE,  "---"    },
98     { UNKNOWN_BUSTYPE,  "---"    },
99     { UNKNOWN_BUSTYPE,  "---"    },
100     { UNKNOWN_BUSTYPE,  "---"    },
101     { UNKNOWN_BUSTYPE,  "---"    },
102     { PCI,              "PCI"    },
103     { UNKNOWN_BUSTYPE,  "---"    },
104     { UNKNOWN_BUSTYPE,  "---"    },
105     { UNKNOWN_BUSTYPE,  "---"    },
106     { UNKNOWN_BUSTYPE,  "---"    },
107     { UNKNOWN_BUSTYPE,  "---"    },
108     { UNKNOWN_BUSTYPE,  "---"    }
109 };
110
111
112
113 typedef struct TABLE_ENTRY {
114     uint8_t     type;
115     uint8_t     length;
116     char        name[ 32 ];
117 } table_entry_t;
118
119 static table_entry_t entry_types[] =
120 {
121     { 0, 20, "Processor" },
122     { 1,  8, "Bus" },
123     { 2,  8, "I/O APIC" },
124     { 3,  8, "I/O INT" },
125     { 4,  8, "Local INT" }
126 };
127
128 /* MP Floating Pointer Structure */
129 typedef struct MPFPS {
130     char        signature[ 4 ];
131     void*       pap;
132     uint8_t     length;
133     uint8_t     spec_rev;
134     uint8_t     checksum;
135     uint8_t     mpfb1;
136     uint8_t     mpfb2;
137     uint8_t     mpfb3;
138     uint8_t     mpfb4;
139     uint8_t     mpfb5;
140 } mpfps_t;
141
142
143 /* MP Configuration Table Header */
144 typedef struct MPCTH {
145     char        signature[ 4 ];
146     uint16_t    base_table_length;
147     uint8_t             spec_rev;
148     uint8_t             checksum;
149     uint8_t             oem_id[ 8 ];
150     uint8_t             product_id[ 12 ];
151     void*               oem_table_pointer;
152     uint16_t    oem_table_size;
153     uint16_t    entry_count;
154     void*               apic_address;
155     uint16_t    extended_table_length;
156     uint8_t             extended_table_checksum;
157     uint8_t             reserved;
158 } mpcth_t;
159
160 typedef struct PROCENTRY {
161     uint8_t             type;
162     uint8_t             apic_id;
163     uint8_t             apic_version;
164     uint8_t             cpu_flags;
165     uint32_t    cpu_signature;
166     uint32_t    feature_flags;
167     uint32_t    reserved1;
168     uint32_t    reserved2;
169 } proc_entry_t;
170
171 typedef struct BUSENTRY {
172     uint8_t     type;
173     uint8_t     bus_id;
174     char (NT bus_type)[ 6 ];
175 } bus_entry_t;
176
177 typedef struct IOAPICENTRY {
178     uint8_t     type;
179     uint8_t     apic_id;
180     uint8_t     apic_version;
181     uint8_t     apic_flags;
182     void*       apic_address;
183 } ioapic_entry_t;
184
185 typedef struct INTENTRY {
186     uint8_t             type;
187     uint8_t             int_type;
188     uint16_t    int_flags;
189     uint8_t             src_bus_id;
190     uint8_t             src_bus_irq;
191     uint8_t             dst_apic_id;
192     uint8_t             dst_apic_int;
193 } int_entry_t;
194
195 typedef struct PCIINTENTRY {
196     uint16_t    dst_apic_id; // A value of INVALID_DEST_APIC means invalid (>=256)
197     uint8_t             dst_apic_int;
198 } pci_int_entry_t;
199
200 typedef pci_int_entry_t isa_int_entry_t;
201
202 typedef struct PCIINTDEVICE {
203         pci_int_entry_t line[4];
204 } pci_int_device_t;
205
206 // Prototypes
207 void mptables_parse();
208 mpfps_t * COUNT(MPFPS_SIZE) find_floating_pointer(physaddr_t base, physaddr_t bound);
209 bool checksum(physaddr_t addr, uint32_t len);
210 void configuration_parse(physaddr_t conf_addr);
211
212 void proc_parse();
213 void bus_parse();
214 void ioapic_parse();
215 void int_parse();
216 void lint_parse();
217
218 #endif /* !ROS_INC_MPTABLES_H */