StuBS
|
Abstraction of the I/O APIC that is used for management of external interrupts. More...
Classes | |
struct | Identification.__unnamed38__ |
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 | |
static Register | read (Index reg) |
static void | write (Index reg, Register value) |
static RedirectionTableEntry | getRedirectionTableEntry (uint8_t slot) |
static void | setRedirectionTableEntry (uint8_t slot, RedirectionTableEntry rt) |
static void | setID (uint8_t id) |
void | init () |
Initializes the I/O APIC. | |
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. | |
void | allow (uint8_t slot) |
Enables the redirection of particular external interrupts to the CPU(s). | |
void | forbid (uint8_t slot) |
Selectively masks external interrupts by slot number. | |
bool | status (uint8_t slot) |
Check whether an external interrupt source is masked. | |
Constants | |
volatile Index * | IOREGSEL_REG = reinterpret_cast<volatile Index*>(0xfec00000) |
IOAPIC registers memory mapped into the CPU's address space. | |
volatile Register * | IOWIN_REG = reinterpret_cast<volatile Register*>(0xfec00010) |
IOAPIC registers memory mapped into the CPU's address space. | |
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).
struct IOAPIC::Identification.__unnamed38__ |
typedef uint32_t IOAPIC::Index |
typedef uint32_t IOAPIC::Register |
enum IOAPIC::DeliveryMode |
Delivery mode specifies the type of interrupt sent to the CPU.
enum IOAPIC::Polarity |
enum IOAPIC::TriggerMode |
|
static |
|
static |
|
static |
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 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_REG
IOWIN_REG
.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_REG
IOWIN_REG
.const Index IOAPIC::IOAPICID_IDX = 0x00 |
const Index IOAPIC::IOREDTBL_IDX = 0x10 |
const uint8_t IOAPIC::slot_max = 24 |