Friedrich-Alexander-Universität Erlangen-Nürnberg  /   Technische Fakultät  /   Department Informatik

Abstraktion des IO-APICs, der zur Verwaltung der externen Interrupts dient.KernstĂŒck des IOAPICs ist die IO-Redirection Table. Dort lĂ€sst sich frei konfigurieren, welchem Interruptvektor eine bestimmte externe Unterbrechung zugeordnet werden soll. Ein Eintrag in dieser Tabelle ist 64 Bit breit. Die Überlagerung (union) IOAPIC::RedirectionTableEntry enthĂ€lt Bitfelder, welche die einzelnen Einstellungen eines Eintrages zugĂ€nglich machen sowie zwei 32 Bit-Werte, die die passende ReprĂ€sentation fĂŒr die Register der IO-Redirection Table aus den Bitfeldern liefern. Mehr ...

Klassen

union  Identification
 ID des IO-APICs. Mehr ...
 
union  RedirectionTableEntry
 Eintrag in der Redirection-Tabelle. Mehr ...
 

Typdefinitionen

typedef uint32_t Index
 
typedef uint32_t Register
 

AufzÀhlungen

enum  DeliveryMode {
  Fixed = 0, LowestPriority = 1, SMI = 2, NMI = 4,
  INIT = 5, ExternInt = 7
}
 Reaktionstyp eines Prozessor auf einen Interrupt. Mehr ...
 
enum  DestinationMode { Physical = 0, Logical = 1 }
 Interpretationen der Zielprozessorangabe in einem Redirection Table Eintrag. Mehr ...
 
enum  Polarity { High = 0, Low = 1 }
 InterruptpolaritĂ€ten fĂŒr den Eintrags in der Redirection Table. Mehr ...
 
enum  TriggerMode { Edge = 0, Level = 1 }
 Interrupterkennung. Mehr ...
 
enum  DeliveryStatus { Idle = 0, SendPending = 1 }
 Interruptstatus. Mehr ...
 
enum  InterruptMask { Unmasked = 0, Masked = 1 }
 Interruptmaske. Mehr ...
 

Funktionen

void init ()
 Initialisierung der IOAPICs. Mehr ...
 
void config (uint8_t slot, Plugbox::Vector vector, TriggerMode trigger_mode=TriggerMode::Edge, Polarity polarity=Polarity::High)
 Zuordnung eines Vektors in der Interruptvektortabelle zu einem externen Interrupt. Mehr ...
 
void allow (uint8_t slot)
 Sorgt dafĂŒr, dass Unterbrechungen des zugeordneten GerĂ€tes an die CPU(s) weitergereicht werden. Mehr ...
 
void forbid (uint8_t slot)
 Ermöglicht einzelne Interrupts selektiv zu sperren. Mehr ...
 
bool status (uint8_t slot)
 Ermöglicht eine Abfrage des Maskierungsstatus fĂŒr einzelne Interrupts. Mehr ...
 

Variablen

volatile Index * IOREGSEL_REG = (volatile Index*)0xfec00000
 Memory-Mapped Register des IO-APIC im Adressraum der CPU. Mehr ...
 
volatile Register * IOWIN_REG = (volatile Register*)0xfec00010
 Memory-Mapped Register des IO-APIC im Adressraum der CPU. Mehr ...
 
const Index IOAPICID_IDX = 0x00
 
const Index IOREDTBL_IDX = 0x10
 
const uint8_t slot_max = 24
 

AusfĂŒhrliche Beschreibung

Abstraktion des IO-APICs, der zur Verwaltung der externen Interrupts dient.

KernstĂŒck des IOAPICs ist die IO-Redirection Table. Dort lĂ€sst sich frei konfigurieren, welchem Interruptvektor eine bestimmte externe Unterbrechung zugeordnet werden soll. Ein Eintrag in dieser Tabelle ist 64 Bit breit. Die Überlagerung (union) IOAPIC::RedirectionTableEntry enthĂ€lt Bitfelder, welche die einzelnen Einstellungen eines Eintrages zugĂ€nglich machen sowie zwei 32 Bit-Werte, die die passende ReprĂ€sentation fĂŒr die Register der IO-Redirection Table aus den Bitfeldern liefern.

Einstellungsmöglichkeiten fĂŒr den IOAPIC.

Dokumentation der AufzÀhlungstypen

◆ DeliveryMode

Reaktionstyp eines Prozessor auf einen Interrupt.

AufzÀhlungswerte
Fixed 

normaler Interrupt an alle Zielprozessoren aus Maske

LowestPriority 

normaler Interrupt an Zielprozessor aus der Maske mit der niedrigsten PrioritÀt

SMI 

Systemverwaltungsunterbrechung, Vektornummer muss 0 sein.

NMI 

Nicht-maskierbarer Interrupt, Vektornummer wird ignoriert, nur flankengesteuert.

INIT 

Initialisierungssignal (nur flankengesteuert)

ExternInt 

externer Interrupt (nur flankengesteuert)

◆ DeliveryStatus

Interruptstatus.

AufzÀhlungswerte
Idle 

keine AktivitĂ€t fĂŒr Interrupt

SendPending 

Interrupt wird versendet sobald Bus / LAPIC frei ist.

◆ DestinationMode

Interpretationen der Zielprozessorangabe in einem Redirection Table Eintrag.

AufzÀhlungswerte
Physical 

Sende an Ziel (APIC) ID.

Logical 

Sende an Gruppe von Prozessoren.

◆ InterruptMask

Interruptmaske.

AufzÀhlungswerte
Unmasked 

Interrupteintrag ist aktiv (nicht maskiert)

Masked 

Interrupteintrag ist deaktiviert (maskiert)

◆ Polarity

InterruptpolaritĂ€ten fĂŒr den Eintrags in der Redirection Table.

AufzÀhlungswerte
High 

Aktiv bei hohem Pegel.

Low 

Aktiv bei niedrigem Pegel.

◆ TriggerMode

Interrupterkennung.

AufzÀhlungswerte
Edge 

Flankengesteuert.

Level 

Pegelgesteuert.

Dokumentation der Funktionen

◆ allow()

void IOAPIC::allow ( uint8_t  slot)

Sorgt dafĂŒr, dass Unterbrechungen des zugeordneten GerĂ€tes an die CPU(s) weitergereicht werden.

Um eine Unterbrechungsbehandlung zu ermöglichen, muss zusÀtzlich CPU::Interrupt::enable() in der main() aufgerufen werden.

Parameter
slotNummer des freizuschaltenden Slots

◆ config()

void IOAPIC::config ( uint8_t  slot,
Plugbox::Vector  vector,
TriggerMode  trigger_mode = TriggerMode::Edge,
Polarity  polarity = Polarity::High 
)

Zuordnung eines Vektors in der Interruptvektortabelle zu einem externen Interrupt.

Parameter
slotNummer des zu konfigurierenden Slots (und damit des dazugehörigen externen Interrupts) in der IO-Redirection Table.
vectorNummer des Vektors, der durch den mit slot ausgewÀhlten externen Interrupt aktiviert werden soll.
trigger_modeFlanken- oder pegelgesteuerte Interruptsignalisierung (letzteres wird bei der optionalen seriellen Schnittstelle benötigt)
polarityArt der Interruptsignalisierung

◆ forbid()

void IOAPIC::forbid ( uint8_t  slot)

Ermöglicht einzelne Interrupts selektiv zu sperren.

Parameter
slotNummer des zu sperrenden Slots

◆ init()

void IOAPIC::init ( )

Initialisierung der IOAPICs.

Dabei werden alle EintrÀge in der IO-Redirection Table mit einem sinnvollen Wert vorbelegt. Das Feld, welches den auszulösenden Interruptvektor angibt, sollte mit einer Vektornummer vorbelegt werden, die so konfiguriert ist, dass sie den Panic-Handler auslöst. Initial sollten auch alle externen Interrupts im IOAPIC deaktiviert werden. Neben der Vektortabelle muss auch die APICID im IOAPICID-Register auf den Wert gesetzt werden, der wÀhrend des Bootvorgangs aus den Systembeschreibungstabellen gelesen wurde. (siehe dazu System::getIOAPICID() )

◆ status()

bool IOAPIC::status ( uint8_t  slot)

Ermöglicht eine Abfrage des Maskierungsstatus fĂŒr einzelne Interrupts.

Parameter
slotgibt an, fĂŒr welchen Slot der Status abgefragt werden soll.
RĂŒckgabe
gibt true zurĂŒck, falls der Interrupt zugelassen ist und false, falls er ausmaskiert wurde.

Variablen-Dokumentation

◆ IOREGSEL_REG

volatile Index * IOAPIC::IOREGSEL_REG = (volatile Index*)0xfec00000

Memory-Mapped Register des IO-APIC im Adressraum der CPU.

Zugriff auf die eigentlichen Register des IO-APICs ist folgendermaßen möglich: An die Adresse von IOAPIC::IOREGSEL_REG schreibt man zuerst die Nummer des IO-APIC-Registers, welches man lesen oder schreiben möchte. In IOAPIC::IOWIN_REG kann man dann den Wert des vorher ausgewĂ€hlten IO-APIC-Registers entweder lesen oder schreiben.

Siehe auch
IO-APIC manual, p. 8

◆ IOWIN_REG

volatile Register * IOAPIC::IOWIN_REG = (volatile Register*)0xfec00010

Memory-Mapped Register des IO-APIC im Adressraum der CPU.

Zugriff auf die eigentlichen Register des IO-APICs ist folgendermaßen möglich: An die Adresse von IOAPIC::IOREGSEL_REG schreibt man zuerst die Nummer des IO-APIC-Registers, welches man lesen oder schreiben möchte. In IOAPIC::IOWIN_REG kann man dann den Wert des vorher ausgewĂ€hlten IO-APIC-Registers entweder lesen oder schreiben.

Siehe auch
IO-APIC manual, p. 8