1 // See MultiProcessor Specification Version 1.[14] 2 3 struct mp { // floating pointer 4 uchar signature[4]; // "_MP_" 5 void *physaddr; // phys addr of MP config table 6 uchar length; // 1 7 uchar specrev; // [14] 8 uchar checksum; // all bytes must add up to 0 9 uchar type; // MP system config type 10 uchar imcrp; 11 uchar reserved[3]; 12 }; 13 14 struct mpconf { // configuration table header 15 uchar signature[4]; // "PCMP" 16 ushort length; // total table length 17 uchar version; // [14] 18 uchar checksum; // all bytes must add up to 0 19 uchar product[20]; // product id 20 uint *oemtable; // OEM table pointer 21 ushort oemlength; // OEM table length 22 ushort entry; // entry count 23 uint *lapicaddr; // address of local APIC 24 ushort xlength; // extended table length 25 uchar xchecksum; // extended table checksum 26 uchar reserved; 27 }; 28 29 struct mpproc { // processor table entry 30 uchar type; // entry type (0) 31 uchar apicid; // local APIC id 32 uchar version; // local APIC verison 33 uchar flags; // CPU flags 34 #define MPBOOT 0x02 // This proc is the bootstrap processor. 35 uchar signature[4]; // CPU signature 36 uint feature; // feature flags from CPUID instruction 37 uchar reserved[8]; 38 }; 39 40 struct mpioapic { // I/O APIC table entry 41 uchar type; // entry type (2) 42 uchar apicno; // I/O APIC id 43 uchar version; // I/O APIC version 44 uchar flags; // I/O APIC flags 45 uint *addr; // I/O APIC address 46 }; 47 48 // Table entry types 49 #define MPPROC 0x00 // One per processor 50 #define MPBUS 0x01 // One per bus 51 #define MPIOAPIC 0x02 // One per I/O APIC 52 #define MPIOINTR 0x03 // One per bus interrupt source 53 #define MPLINTR 0x04 // One per system interrupt source 54 55 //PAGEBREAK! 56 // Blank page.