C++ Crashkurs
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 virtual address space. More... | |
volatile Register * | IOWIN_REG = reinterpret_cast<volatile Register*>(0xfec00010) |
IOAPIC registers memory mapped into the CPU's virtual address space. More... | |
const Index | IOAPICID_IDX = 0x00 |
const Index | IOREDTBL_IDX = 0x10 |
const uint8_t | slot_max = 24 |
Detailed Description
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).
Enumeration Type Documentation
enum IOAPIC::DeliveryMode |
Delivery mode specifies the type of interrupt sent to the CPU.
enum IOAPIC::Polarity |
enum IOAPIC::TriggerMode |
Function Documentation
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.
- Parameters
-
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)
- Parameters
-
slot Number of the external interrupt that should be enabled.
void IOAPIC::forbid | ( | uint8_t | slot | ) |
Selectively masks external interrupts by slot number.
- Parameters
-
slot Slot number of the interrupt to be disabled.
bool IOAPIC::status | ( | uint8_t | slot | ) |
Check whether an external interrupt source is masked.
- Parameters
-
slot Slot number of the interrupt to be checked.
- Returns
- Returns
true
iff the interrupt is unmasked,false
otherwise
Constant Documentation
volatile Index * IOAPIC::IOREGSEL_REG = reinterpret_cast<volatile Index*>(0xfec00000) |
IOAPIC registers memory mapped into the CPU's virtual address space.
Access to the actual IOAPIC registers can be obtained by performing the following steps:
- Write the number of the IOAPIC register to the address stored in
IOREGSEL_REG
- Read the value from / write the value to the address referred to by
IOWIN_REG
.
- See also
- IO-APIC manual
volatile Register * IOAPIC::IOWIN_REG = reinterpret_cast<volatile Register*>(0xfec00010) |
IOAPIC registers memory mapped into the CPU's virtual address space.
Access to the actual IOAPIC registers can be obtained by performing the following steps:
- Write the number of the IOAPIC register to the address stored in
IOREGSEL_REG
- Read the value from / write the value to the address referred to by
IOWIN_REG
.
- See also
- IO-APIC manual