
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 Struktur IOAPIC::RedirectionTableEntry ist Bitfelder, das die einzelnen Einstellungen eines Eintrages zugänglich macht. Mehr ...
Klassen | |
union | Identification |
ID des IO-APICs. Mehr ... | |
union | RedirectionTableEntry |
Eintrag in der Redirection Tablle. 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 |
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 Struktur IOAPIC::RedirectionTableEntry ist Bitfelder, das die einzelnen Einstellungen eines Eintrages zugänglich macht.
Einstellungsmöglichkeiten für den IOAPIC.
enum IOAPIC::DeliveryMode |
Reaktionstyp eines Prozessor auf einen Interrupt.
Interruptstatus.
Aufzählungswerte | |
---|---|
Idle | keine Aktivität für Interrupt |
SendPending | Interrupt wird versendet sobald Bus / LAPIC frei ist. |
enum IOAPIC::Polarity |
enum IOAPIC::TriggerMode |
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.
slot | Nummer des freizuschaltenden Slots |
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.
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. |
trigger_mode | Flanken- oder pegelgesteuerte Interruptsignalisierung (letzteres wird bei der optionalen seriellen Schnittstelle benötigt) |
polarity | Art der Interruptsignalisierung |
void IOAPIC::forbid | ( | uint8_t | 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. (System::getIOAPICID())
bool IOAPIC::status | ( | uint8_t | 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. 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.
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.