Abstraction of the I/O APIC that is used for management of external interrupts. More...
Classes | |
| union | Identification | 
| I/O APIC Identification.  More... | |
| union | RedirectionTableEntry | 
| Entry in the redirection table.  More... | |
Structs | |
| struct | Identification.__unnamed__ | 
Typedefs | |
| typedef uint32_t | Index | 
| typedef uint32_t | Register | 
Enumerations | |
| enum | DeliveryMode {  FIXED = 0, LOWEST_PRIORITY = 1, SMI = 2, NMI = 4, INIT = 5, EXTERN_INT = 7 }  | 
| Delivery mode specifies the type of interrupt sent to the CPU.  More... | |
| enum | DestinationMode {  PHYSICAL = 0, LOGICAL = 1 }  | 
| Way of interpreting the value written to the destination field.  More... | |
| enum | Polarity {  HIGH = 0, LOW = 1 }  | 
| Interrupt polarity for the redirection-table entry.  More... | |
| enum | TriggerMode {  EDGE = 0, LEVEL = 1 }  | 
| Trigger mode.  More... | |
| enum | DeliveryStatus {  IDLE = 0, SEND_PENDING = 1 }  | 
| Interrupt state.  More... | |
| enum | InterruptMask {  UNMASKED = 0, MASKED = 1 }  | 
| Interrupt masking.  More... | |
Functions | |
| void | init () | 
| Initializes the I/O APIC.  More... | |
| void | config (uint8_t slot, Core::Interrupt::Vector vector, TriggerMode trigger_mode=TriggerMode::EDGE, Polarity polarity=Polarity::HIGH) | 
| Creates a mapping between an interrupt vector and an external interrupt.  More... | |
| void | allow (uint8_t slot) | 
| Enables the redirection of particular external interrupts to the CPU(s).  More... | |
| void | forbid (uint8_t slot) | 
| Selectively masks external interrupts by slot number.  More... | |
| bool | status (uint8_t slot) | 
| Check whether an external interrupt source is masked.  More... | |
Constants | |
| volatile Index * | IOREGSEL_REG = reinterpret_cast<volatile Index*>(0xfec00000) | 
| IOAPIC registers memory mapped into the CPU's address space.  More... | |
| volatile Register * | IOWIN_REG = reinterpret_cast<volatile Register*>(0xfec00010) | 
| IOAPIC registers memory mapped into the CPU's address space.  More... | |
| const Index | IOAPICID_IDX = 0x00 | 
| const Index | IOREDTBL_IDX = 0x10 | 
| const uint8_t | slot_max = 24 | 
Abstraction of the I/O APIC that is used for management of external interrupts.
The I/O APIC's Core component is the IO-redirection table. This table is used to configure a flexible mapping between the interrupt number and the external interruption. Entries within this table have a width of 64 bit. For convenience, the union IOAPIC::RedirectionTableEntry should be used for modifying these tables (see file ioapic_registers.h for details). 
| enum IOAPIC::DeliveryMode | 
Delivery mode specifies the type of interrupt sent to the CPU.
| enum IOAPIC::Polarity | 
| enum IOAPIC::TriggerMode | 
| void IOAPIC::init | ( | ) | 
Initializes the I/O APIC.
This function will initialize the I/O APIC by initializing the IO-redirection table with sane default values. The default interrupt-vector number is chosen such that, in case the interrupt is issued, the panic handler is executed. In the beginning, all external interrupts are disabled within the I/O APIC. Apart from the redirection table, the APICID (read from the system description tables during boot) needs to be written to the IOAPICID register (see APIC::getIOAPICID() ) 
| void IOAPIC::config | ( | uint8_t | slot, | 
| Core::Interrupt::Vector | vector, | ||
| TriggerMode | trigger_mode = TriggerMode::EDGE,  | 
        ||
| Polarity | polarity = Polarity::HIGH  | 
        ||
| ) | 
Creates a mapping between an interrupt vector and an external interrupt.
| slot | Number of the slot (i.e., the external interrupt) to configure. | 
| vector | Number of the interrupt vector that will be issued for the external interrupt. | 
| trigger_mode | Edge or level triggered interrupt signaling (level-triggered interrupts required for the optional serial interface) | 
| polarity | Polarity of the interrupt signaling (active high or active low) | 
| void IOAPIC::allow | ( | uint8_t | slot | ) | 
Enables the redirection of particular external interrupts to the CPU(s).
To fully enable interrupt handling, the interrupts must be enabled for every CPU (e.g., by calling Core::Interrupt::enable() in main)
| slot | Number of the external interrupt that should be enabled. | 
| void IOAPIC::forbid | ( | uint8_t | slot | ) | 
Selectively masks external interrupts by slot number.
| slot | Slot number of the interrupt to be disabled. | 
| bool IOAPIC::status | ( | uint8_t | slot | ) | 
Check whether an external interrupt source is masked.
| slot | Slot number of the interrupt to be checked. | 
true iff the interrupt is unmasked, false otherwise | volatile Index * IOAPIC::IOREGSEL_REG = reinterpret_cast<volatile Index*>(0xfec00000) | 
IOAPIC registers memory mapped into the CPU's address space.
Access to the actual IOAPIC registers can be obtained by performing the following steps:
IOREGSEL_REGIOWIN_REG.| volatile Register * IOAPIC::IOWIN_REG = reinterpret_cast<volatile Register*>(0xfec00010) | 
IOAPIC registers memory mapped into the CPU's address space.
Access to the actual IOAPIC registers can be obtained by performing the following steps:
IOREGSEL_REGIOWIN_REG.