Local Advanced Programmable Interrupt Controller

Aus Lowlevel
Wechseln zu:Navigation,

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.

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 oder über das MSR 0x001B ausgelesen werden.

Initialisierung

Zuerstmal muss man die Local APIC über das Spurious Interrupt Vector Register aktivieren (und natürlich den Spurious Interrupt Vector setzten). Anschließend sind noch folgende Register zu initialisieren:

  • Task Priority Register
  • LVT Timer Register
  • LVT Thermal Sensor Register
  • LVT Performance Counter Register
  • LVT LINT0 Register
  • LVT LINT1 Register
  • LVT Error Register

Bug beim Beschreiben der Regsiter

Bei Pentium Prozessoren mit einer Geschwindigkeit über 75 MHz aus der Prozessor-Familie 5 mit der Modellnummer 2 und der Revisionsnummer (Stepping) 1,2,3,4 oder 11 wird jegliches einfache Schreiben in LAPIC Register ignoriert. Um dies zu verhindern, muss vor einem Schreibzugriff auf den APIC zuerst etwas daraus ausgelesen werden.

End of Interrupt

Ein End of Interrupt (EOI) wird der Local APIC signalisiert, in dem man in das EOI Register den Wert 0 schreibt.

Weblinks