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.