OOStuBS/MPStuBS
IOAPIC Klassenreferenz

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

#include <ioapic.h>

Öffentliche Methoden

 IOAPIC ()
 Konstruktor. Tut nichts. Initialisierung erfolgt mit init()
 
void init ()
 Initialisierung der IOAPICs. Mehr ...
 
void config (unsigned char slot, Plugbox::Vector vector, int triggermode=TRIGGER_MODE_EDGE, int polarity=POLARITY_HIGH)
 Zuordnung eines Vektors in der Interruptvektortabelle zu einem externen Interrupt. Mehr ...
 
void allow (unsigned char slot)
 Sorgt dafür, dass Unterbrechungen des zugeordneten Gerätes an die CPU(s) weitergereicht werden. Mehr ...
 
void forbid (unsigned char slot)
 Ermöglicht einzelne Interrupts selektiv zu sperren. Mehr ...
 
bool status (unsigned char slot)
 Ermöglicht eine Abfrage des Maskierungsstatus für einzelne Interrupts. Mehr ...
 

Statische öffentliche Attribute

static volatile uint32_t * IOREGSEL_REG = (volatile uint32_t*)0xfec00000
 Memory-Mapped Register des IO-APIC im Adressraum der CPU. Mehr ...
 
static volatile uint32_t * IOWIN_REG = (volatile uint32_t*)0xfec00010
 Memory-Mapped Register des IO-APIC im Adressraum der CPU. Mehr ...
 

Private Methoden

void setID (unsigned char id)
 Setzt die ID des IO-APICs auf id. Mehr ...
 

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 Strukturen IOREDTBL_L und IOREDTBL_H sind Bitfelder, die die einzelnen Einstellungen eines Eintrages zugänglich machen.

Dokumentation der Elementfunktionen

◆ allow()

void IOAPIC::allow ( unsigned char  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::enable_int() in der main() aufgerufen werden.

Parameter
slotNummer des freizuschaltenden Slots

◆ config()

void IOAPIC::config ( unsigned char  slot,
Plugbox::Vector  vector,
int  triggermode = TRIGGER_MODE_EDGE,
int  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.
triggermodeFlanken- oder pegelgesteuerte Interruptsignalisierung (letzteres wird bei der optionalen seriellen Schnittstelle benötigt)
polarityArt der Interruptsignalisierung

◆ forbid()

void IOAPIC::forbid ( unsigned char  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. (APICSystem::getIOAPICID())

◆ setID()

void IOAPIC::setID ( unsigned char  id)
private

Setzt die ID des IO-APICs auf id.

Parameter
idNeue ID des IO-APICs; Wert muss zwischen 0 und 15 liegen

◆ status()

bool IOAPIC::status ( unsigned char  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.

Dokumentation der Datenelemente

◆ IOREGSEL_REG

volatile uint32_t * IOAPIC::IOREGSEL_REG = (volatile uint32_t*)0xfec00000
static

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 uint32_t * IOAPIC::IOWIN_REG = (volatile uint32_t*)0xfec00010
static

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

Die Dokumentation für diese Klasse wurde erzeugt aufgrund der Dateien: