OOStuBS/MPStuBS
|
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 ... | |
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.
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.
slot | Nummer des freizuschaltenden Slots |
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.
slot | Nummer des zu konfigurierenden Slots (und damit des dazugehörigen externen Interrupts) in der IO-Redirection Table. |
vector | Nummer des Vektors, der durch den mit slot ausgewählten externen Interrupt aktiviert werden soll. |
triggermode | Flanken- oder pegelgesteuerte Interruptsignalisierung (letzteres wird bei der optionalen seriellen Schnittstelle benötigt) |
polarity | Art der Interruptsignalisierung |
void IOAPIC::forbid | ( | unsigned char | slot | ) |
Ermöglicht einzelne Interrupts selektiv zu sperren.
slot | Nummer des zu sperrenden Slots |
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())
|
private |
Setzt die ID des IO-APICs auf id.
id | Neue ID des IO-APICs; Wert muss zwischen 0 und 15 liegen |
bool IOAPIC::status | ( | unsigned char | slot | ) |
Ermöglicht eine Abfrage des Maskierungsstatus für einzelne Interrupts.
slot | gibt an, für welchen Slot der Status abgefragt werden soll. |
true
zurück, falls der Interrupt zugelassen ist und false
, falls er ausmaskiert wurde.
|
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.
|
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.