Symmetric Multiprocessing: Difference between revisions

[unchecked revision][unchecked revision]
Content deleted Content added
added information how to find the MP tables
Line 16:
 
You can broadcast these signals across the bus to start every device that is present. However by doing so you might also enable the processors that were disabled on purpose (because they were defective).
 
==Finding information==
There is information about a computer's processors, APICs, etc. in the ACPI tables. However, some information (which may not be present on newer machines) dedicated for multiprocessing is available. First one must find the MP Floating Pointer Structure. It is aligned on a 16 byte boundary, and contains a signature at the start "_MP_" or 0x5F504D5F. The OS must search in the EBDA, the BIOS ROM space, and last kilobyte of "base memory"; the size of base memory is specified in a 2 byte value at 0x413 in kilobytes, minus 1K.
Here is what the structure looks like:
<source lang="c">
struct mp_floating_pointer_structure {
char signature[4];
uint32_t configuration_table;
uint8_t length; // In 16 bytes (e.g. 1 = 16 bytes, 2 = 32 bytes)
uint8_t mp_specification_revision;
uint8_t checksum; // This value should make all bytes in the table equal 0 when added together
uint8_t default_configuration; // If this is not zero then configuration_table should be
// ignored and a default configuration should be loaded instead
uint32_t features; // If bit 7 is then the IMCR is present and PIC mode is being used, otherwise
// virtual wire mode is; all other bits are reserved
}
</source>
Here is what the configuration table, pointed to by the floating pointer structure looks like:
<source lang="c">
struct mp_configuration_table {
char signature[4]; // "PCMP"
uint16_t length;
uint8_t mp_specification_revision;
uint8_t checksum; // Again, the byte should be all bytes in the table add up to 0
char oem_id[8];
char product_id[12];
uint32_t oem_table;
uint16_t oem_table_size;
uint16_t entry_count; // This value represents how many entries are following this table
uint32_t lapic_address; // This is the memory mapped address of the local APICs
uint16_t extended_table_length;
uint8_t extended_table_checksum;
uint8_t reserved;
}
</source>
After the configuration table, there are entry_count entries describing more information about the system, then after that there is an extended table. The entries are either 20 bytes to represent a processor, or 8 bytes for something else. Here are what the processor and IO APIC entries look like.
<source lang="c">
struct entry_processor {
uint8_t type; // Always 0
uint8_t local_apic_id;
uint8_t local_apic_version;
uint8_t flags; // If bit 0 is set then the processor must be ignored
// If bit 1 is set then the processor is the bootstrap processor
uint32_t signature;
uint32_t feature_flags;
uint64_t reserved;
}
</source>
Here is an IO APIC entry.
<source lang="c">
struct entry_io_apic {
uint8_t type; // Always 2
uint8_t id;
uint8_t version;
uint8_t flags; // If bit 0 is set then the entry should be ignored
uint32_t address; // The memory mapped address of the IO APIC is memory
}
</source>
For more information, see http://www.intel.com/design/pentium/datashts/24201606.pdf, chapter 4.
 
==See Also==