Local Advanced Programmable Interrupt Controller
Die LAPIC oder Local APIC (= Local Advanced Programmable Interrupt Controller) nimmt Interrupts von der I/O APIC (oder auch von der PIC) und anderen prozessorinternen Einheiten an und leitet diese an den Prozessorkern zum Abarbeiten weiter. Außerdem ist es nur über die LAPIC möglich IPIs zu senden und zu empfangen.
Inhaltsverzeichnis
Register
Aufbau
Die Register der Local APIC sind in den physischen Speicher eingeblendet. Jedes der Register beginnt an einer 16 Byte Grenze, erstreckt sich aber nur über die ersten 32 Bit. Falls das Register größer als 32 Bit ist, befinden sich die nächst höheren 32 Bit an der nächst höheren 16 Byte Grenze. Die Local APIC stellt folgende Register zur Programmierung bereit:
| Offset | r/w | Größe (Bit) | Abkürzung | Name des Registers |
|---|---|---|---|---|
| 0x0020 | r/w | 32 | Local APIC ID Register | |
| 0x0030 | r | 32 | Local APIC Version Register | |
| 0x0080 | r/w | 32 | TPR | Task Priority Register |
| 0x0090 | r | 32 | APR | Arbitration Priority Register ¹ |
| 0x00A0 | r | 32 | PPR | Processor Priority Register |
| 0x00B0 | w | 32 | EOI Register | |
| 0x00D0 | r/w | 32 | Logical Destination Register | |
| 0x00E0 | r/w | 32 | Destination Format Register | |
| 0x00F0 | r/w | 32 | Spurious Interrupt Vector Register | |
| 0x0100 0x0170 |
r | 256 | ISR | In-Service Register |
| 0x0180 0x01F0 |
r | 256 | TMR | Trigger Mode Register |
| 0x0200 0x0270 |
r | 256 | IRR | Interrupt Request Register |
| 0x0280 | r | 32 | Error Status Register | |
| 0x0300 0x0310 |
r/w | 64 | ICR | Interrupt Command Register |
| 0x0320 | r/w | 32 | LVT Timer Register | |
| 0x0330 | r/w | 32 | LVT Thermal Sensor Register ² | |
| 0x0340 | r/w | 32 | LVT Performance Monitoring Counters Register ³ | |
| 0x0350 | r/w | 32 | LVT LINT0 Register | |
| 0x0360 | r/w | 32 | LVT LINT1 Register | |
| 0x0370 | r/w | 32 | LVT Error Register | |
| 0x0380 | r/w | 32 | Initial Count Register | |
| 0x0390 | r/w | 32 | Current Count Register | |
| 0x03E0 | r/w | 32 | Divide Configuration Register |
¹ Nicht unterstützt in Pentium 4 und Intel Xeon Prozessoren
² Eingeführt mit dem Pentium 4 und Intel Xeon Prozessoren. Dieses Register ist implementationsabhängig und muss in Zukunft nicht mehr vorhanden sein.
³ Eingeführt mit dem Pentium Pro Prozessor. Dieses Register ist implementationsabhängig und muss in Zukunft nicht mehr vorhanden sein.
Local APIC ID Register
P6-Prozessorfamilie und Pentium-Prozessoren:
| 31-28 | 27-24 | 23-0 |
|---|---|---|
| Reserviert | Local APIC ID | Reserviert |
Pentium4, IntelXeon und spätere Prozessoren:
| 31-24 | 23-0 |
|---|---|
| Local APIC ID | Reserviert |
Local APIC Version Register
| 31-24 | 23-16 | 15-8 | 7-0 |
|---|---|---|---|
| Reserviert | Max. LVT-Einträge | Reserviert | Version |
Wenn beim Version-Byte das HighNibble 1 ist, ist es ein Local APIC. Andernfalls ein externer APIC. Bei Pentium 4 und Intel Xeon wird als LocalApic 0x14 zurückgegeben. Bei einem externen APIC entspricht das LowNibble X dem Chip 82489DX.
Das Feld "Max. LVT-Einträge" gibt die Anzahl an maximalen LVT-Einträgen minus 1 an. Das Feld muss bei Pentium 4 und Intel Xeon also auf 5 gesetzt sein, da es maximal 6 LVT-Einträge gibt. Bei der P6-Familie gibt es maximal 5 LVT-Einträge. Pentium-Prozessoren haben nur 4 LVT-Einträge.
Interrupt Command Register (ICR)
Das Interrupt Command Register wird verwendet um IPIs zu versenden.
| Bits | Beschreibung |
|---|---|
| 63-56 | Destination Field |
| 55-20 | Reserviert |
| 19-18 | Destination Shorthand 00b = No shorthand 01b = Self 10b = All Including Self 11b = All excluding Selg |
| 17-16 | Reserviert |
| 15 | Trigger Mode 0b = Edge 1b = Level |
| 14 | Level 0b = De-Assert 1b = Assert |
| 13 | Reserviert |
| 12 | Delivery Status 0b = Idle 1b = Send Pending |
| 11 | Destination Mode 0b = Physical 1b = Logical |
| 10-8 | Delivery Mode 000b = Fixed 001b = Lowest Priority 010b = SMI 011b = Reserviert 100b = NMI 101b = INIT 110b = Startup 111b = Reserviert |
| 7-0 | Vector |
Programmierung
physische Adresse
Die physische Adresse der Register kann entweder aus der Configuration Table der Intel Multiprocessor Specification ausgelesen werden oder über das MSR 0x001B ausgelesen werden.
Initialisierung
In folgender Reihenfolge sollten die Register der Local APIC initialisiert werden:
- Task Priority Register
- LVT Timer Register
- LVT Thermal Sensor Register
- LVT Performance Counter Register
- LVT LINT0 Register
- LVT LINT1 Register
- LVT Error Register
- Spurious Interrupt Vector Register
End of Interrupt
Ein End of Interrupt (EOI) wird der Local APIC signalisiert, in dem man in das EOI Register den Wert 0 schreibt.