Local Advanced Programmable Interrupt Controller — Änderungen 2477 → 2479

Zeile 2: Zeile 2:
  
 
== Register ==
 
== Register ==
−
Die Register liegen normalerweise an der Adresse 0xFEE00000, es ist allerdings sicherer diesen Wert z.B aus dem MP-Header zu entnehmen. Außerdem können sie auch umplatziert werden. Alle Register sind 32bit groß und sind 128bit-aligned.
+
=== 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:
  
−
{| border="1"
+
 
−
! Offset || Name
+
<center>
−
|-
+
{| border="1" cellspacing="0"
−
| 0x20  || [[#Local APIC ID Register | Local APIC ID Register]]
 
−
|-
 
−
| 0x30  || [[#Local APIC Version Register | Local APIC Version Register]]
 
−
|-
 
−
| 0x80  || Task Priority Register (TPR)
 
−
|-
 
−
| 0x90  || Arbitration Priority Register¹ (APR)
 
−
|-
 
−
| 0xA0  || Processor Priority Register (PPR)
 
−
|-
 
−
| 0xB0  || EOI Register
 
−
|-
 
−
| 0xD0  || Logical Destination Register
 
−
|-
 
−
| 0xE0  || Destination Format Register
 
−
|-
 
−
| 0xF0  || Spurious Interrupt Vector Register
 
−
|-
 
−
| 0x100  || In-Service Register (ISR) (0-31)
 
−
|-
 
−
| 0x110  || In-Service Register (ISR) (32-63)
 
−
|-
 
−
| 0x120  || In-Service Register (ISR) (64-95)
 
−
|-
 
−
| 0x130  || In-Service Register (ISR) (96:-27)
 
−
|-
 
−
| 0x140  || In-Service Register (ISR) (128-159)
 
−
|-
 
−
| 0x150  || In-Service Register (ISR) (160-191)
 
−
|-
 
−
| 0x160  || In-Service Register (ISR) (192-223)
 
−
|-
 
−
| 0x170  || In-Service Register (ISR) (224-255)
 
 
|-
 
|-
−
| 0x180  || Trigger Mode Register (TMR) (0-31)
+
! Offset
 +
! r/w
 +
! Größe (Bit)
 +
! Abkürzung
 +
! Name des Registers
 
|-
 
|-
−
| 0x190  || Trigger Mode Register (TMR) (32-63)
+
| 0x0020 || r/w || 32 || || [[LAPIC#Local APIC ID Register | Local APIC ID Register]]
 
|-
 
|-
−
| 0x1A0  || Trigger Mode Register (TMR) (64-95)
+
| 0x0030 || r || 32 || || [[LAPIC#Local APIC Version Register | Local APIC Version Register]]
 
|-
 
|-
−
| 0x1B0  || Trigger Mode Register (TMR) (96-127)
+
| 0x0080 || r/w || 32 || TPR || Task Priority Register
 
|-
 
|-
−
| 0x1C0  || Trigger Mode Register (TMR) (128-159)
+
| 0x0090 || r || 32 || APR || Arbitration Priority Register ¹
 
|-
 
|-
−
| 0x1D0  || Trigger Mode Register (TMR) (160-191)
+
| 0x00A0 || r || 32 || PPR || Processor Priority Register
 
|-
 
|-
−
| 0x1E0  || Trigger Mode Register (TMR) (192-223)
+
| 0x00B0 || w || 32 || || EOI Register
 
|-
 
|-
−
| 0x1F0  || Trigger Mode Register (TMR) (224-255)
+
| 0x00D0 || r/w || 32 || || Logical Destination Register
 
|-
 
|-
−
| 0x200  || Interrupt Request Register (IRR) (0-31)
+
| 0x00E0 || r/w || 32 || || Destination Format Register
 
|-
 
|-
−
| 0x210  || Interrupt Request Register (IRR) (32-63)
+
| 0x00F0 || r/w || 32 || || Spurious Interrupt Vector Register
 
|-
 
|-
−
| 0x220  || Interrupt Request Register (IRR) (64-95)
+
| 0x0100<br>0x0170 || r || 256 || ISR || In-Service Register  
 
|-
 
|-
−
| 0x230  || Interrupt Request Register (IRR) (96-127)
+
| 0x0180<br>0x01F0 || r || 256 || TMR || Trigger Mode Register
 
|-
 
|-
−
| 0x240  || Interrupt Request Register (IRR) (128-159)
+
| 0x0200<br>0x0270 || r || 256 || IRR || Interrupt Request Register
 
|-
 
|-
−
| 0x250  || Interrupt Request Register (IRR) (160-191)
+
| 0x0280 || r || 32 || || Error Status Register
 
|-
 
|-
−
| 0x260  || Interrupt Request Register (IRR) (192-223)
+
| 0x0300<br>0x0310 || r/w || 64 || ICR || [[LAPIC#Interrupt Command Register | Interrupt Command Register]]
 
|-
 
|-
−
| 0x270  || Interrupt Request Register (IRR) (224-255)
+
| 0x0320 || r/w || 32 || || LVT Timer Register
 
|-
 
|-
−
| 0x280  || Error Status Register
+
| 0x0330 || r/w || 32 || || LVT Thermal Sensor Register ²
 
|-
 
|-
−
| 0x300  || [[#Interrupt Command Register (ICR) | Interrupt Command Register (ICR) (0-31)]]
+
| 0x0340 || r/w || 32 || || LVT Performance Monitoring Counters Register ³
 
|-
 
|-
−
| 0x310  || [[#Interrupt Command Register (ICR) | Interrupt Command Register (ICR) (32-63)}}
+
| 0x0350 || r/w || 32 || || LVT LINT0 Register
 
|-
 
|-
−
| 0x320  || LVT Timer Register
+
| 0x0360 || r/w || 32 || || LVT LINT1 Register
 
|-
 
|-
−
| 0x330  || LVT Thermal Register²
+
| 0x0370 || r/w || 32 || || LVT Error Register
 
|-
 
|-
−
| 0x340  || LVT Performance Register³
+
| 0x0380 || r/w || 32 || || Initial Count Register
 
|-
 
|-
−
| 0x350  || LVT LINT0 Register
+
| 0x0390 || r/w || 32 || || Current Count Register
 
|-
 
|-
−
| 0x360  || LVT LINT1 Register
+
| 0x03E0 || r/w || 32 || || Divide Configuration Register
−
|-
 
−
| 0x370  || LVT Error Register
 
−
|-
 
−
| 0x380  || Initial Count Register (für Timer)
 
−
|-
 
−
| 0x390  || Current Count Register (für Timer)
 
−
|-
 
−
| 0x3E0  || Divide Configuration Register (für Timer)
 
 
|}
 
|}
 +
</center>
  
−
1) Nicht unterstützt in Pentium 4 und Intel Xeon Prozessoren
+
 
−
2) Eingeführt mit dem Pentium 4 und Intel Xeon Prozessoren. Dieses Register ist implementations-abhängig und muss in Zukunft nicht mehr vorhanden sein.
+
¹ Nicht unterstützt in Pentium 4 und Intel Xeon Prozessoren<br>
−
3) Eingeführt mit dem Pentium Pro Prozessor. Dieses Register ist implementations-abhängig und muss in Zukunft nicht mehr vorhanden sein.
+
² Eingeführt mit dem Pentium 4 und Intel Xeon Prozessoren. Dieses Register ist implementationsabhängig und muss in Zukunft nicht mehr vorhanden sein.<br>
−
<br />
+
³ Eingeführt mit dem Pentium Pro Prozessor. Dieses Register ist implementationsabhängig und muss in Zukunft nicht mehr vorhanden sein.<br>
  
 
=== Local APIC ID Register ===
 
=== Local APIC ID Register ===
 +
 
P6-Prozessorfamilie und Pentium-Prozessoren:
 
P6-Prozessorfamilie und Pentium-Prozessoren:
 
{| border="1" cellpadding="2"
 
{| border="1" cellpadding="2"
Zeile 120: Zeile 86:
  
 
=== Local APIC Version Register ===
 
=== Local APIC Version Register ===
 +
 
{| border="1" cellpadding="2"
 
{| border="1" cellpadding="2"
 
! 31-24      || 23-16            || 15-8      || 7-0
 
! 31-24      || 23-16            || 15-8      || 7-0
Zeile 125: Zeile 92:
 
| Reserviert || Max. LVT-Einträge || Reserviert || Version
 
| 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.
 
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.
  
Zeile 131: Zeile 99:
  
 
=== Interrupt Command Register (ICR) ===
 
=== Interrupt Command Register (ICR) ===
 +
 
Das Interrupt Command Register wird verwendet um IPIs zu versenden.
 
Das Interrupt Command Register wird verwendet um IPIs zu versenden.
 
{| border="1" cellpadding="2"
 
{| border="1" cellpadding="2"
Zeile 157: Zeile 126:
 
| 7-0  || Vector
 
| 7-0  || Vector
 
|}
 
|}
 +
 +
== Programmierung ==
 +
 +
=== physische Adresse ===
 +
 +
Die physische Adresse der Register kann entweder aus der [[SMP#Configuration_Table | 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.
  
 
== Weblinks ==
 
== Weblinks ==
Zeile 164: Zeile 154:
 
[[Kategorie:Hardware]]
 
[[Kategorie:Hardware]]
 
[[Kategorie:Glossar]]
 
[[Kategorie:Glossar]]
−
[[Kategorie:Stub]]
+
[[Kategorie:Tutorials]]