Die '''LAPIC''' oder '''Local APIC''' (= '''Local Advanced Programmable Interrupt Controller''') nimmt [[Interrupt | 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 [[IPI | IPIs]] zu senden und zu empfangen.
== 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.
{| border="1"
! Offset || Name
|-
| 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)
|-
| 0x190 || Trigger Mode Register (TMR) (32-63)
|-
| 0x1A0 || Trigger Mode Register (TMR) (64-95)
|-
| 0x1B0 || Trigger Mode Register (TMR) (96-127)
|-
| 0x1C0 || Trigger Mode Register (TMR) (128-159)
|-
| 0x1D0 || Trigger Mode Register (TMR) (160-191)
|-
| 0x1E0 || Trigger Mode Register (TMR) (192-223)
|-
| 0x1F0 || Trigger Mode Register (TMR) (224-255)
|-
| 0x200 || Interrupt Request Register (IRR) (0-31)
|-
| 0x210 || Interrupt Request Register (IRR) (32-63)
|-
| 0x220 || Interrupt Request Register (IRR) (64-95)
|-
| 0x230 || Interrupt Request Register (IRR) (96-127)
|-
| 0x240 || Interrupt Request Register (IRR) (128-159)
|-
| 0x250 || Interrupt Request Register (IRR) (160-191)
|-
| 0x260 || Interrupt Request Register (IRR) (192-223)
|-
| 0x270 || Interrupt Request Register (IRR) (224-255)
|-
| 0x280 || Error Status Register
|-
| 0x300 || [[#Interrupt Command Register (ICR) | Interrupt Command Register (ICR) (0-31)]]
|-
| 0x310 || [[#Interrupt Command Register (ICR) | Interrupt Command Register (ICR) (32-63)}}
|-
| 0x320 || LVT Timer Register
|-
| 0x330 || LVT Thermal Register²
|-
| 0x340 || LVT Performance Register³
|-
| 0x350 || LVT LINT0 Register
|-
| 0x360 || LVT LINT1 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)
|}
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.
3) Eingeführt mit dem Pentium Pro Prozessor. Dieses Register ist implementations-abhängig und muss in Zukunft nicht mehr vorhanden sein.
=== Local APIC ID Register ===
P6-Prozessorfamilie und Pentium-Prozessoren:
{| border="1" cellpadding="2"
! 31-28 || 27-24 || 23-0
|-
| Reserviert || Local APIC ID || Reserviert
|}
Pentium4, IntelXeon und spätere Prozessoren:
{| border="1" cellpadding="2"
! 31-24 || 23-0
|-
| Local APIC ID || Reserviert
|}
=== Local APIC Version Register ===
{| border="1" cellpadding="2"
! 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.
{| border="1" cellpadding="2"
! 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
|}
== Weblinks ==
* [http://www.intel.com/products/processor/manuals/index.htm Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide] (Kapitel 8)
* [http://www.amd.com/us-en/Processors/DevelopWithAMD/0,,30_2252_739_7044,00.html AMD64 Architecture Programmer's Manual Volume 2: System Programming] (Kapitel 16)
[[Kategorie:Hardware]]
[[Kategorie:Glossar]]
[[Kategorie:Stub]]