StuBS
|
Inter-Processor Interrupts. More...
Classes | |
union | InterruptCommand |
Interrupt Command. More... | |
Enumerations | |
enum | DeliveryMode { FIXED = 0 , LOWEST_PRIORITY = 1 , SMI = 2 , NMI = 4 , INIT = 5 , INIT_LEVEL_DEASSERT = 5 , STARTUP = 6 } |
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 | DeliveryStatus { IDLE = 0 , SEND_PENDING = 1 } |
Interrupt state. More... | |
enum | Level { DEASSERT = 0 , ASSERT = 1 } |
Interrupt level. More... | |
enum | TriggerMode { EDGE_TRIGGERED = 0 , LEVEL_TRIGGERED = 1 } |
Trigger mode for DeliveryMode::INIT_LEVEL_DEASSERT. More... | |
enum | DestinationShorthand { NO_SHORTHAND = 0 , SELF = 1 , ALL_INCLUDING_SELF = 2 , ALL_EXCLUDING_SELF = 3 } |
Shorthand for commonly used destinations. More... | |
enum | InterruptMask { UNMASKED = 0 , MASKED = 1 } |
Interrupt mask. More... | |
Functions | |
bool | isDelivered () |
Check if the previously sent IPI has reached its destination. | |
void | send (uint8_t destination, uint8_t vector) |
Send an Inter-Processor Interrupt (IPI) | |
void | sendGroup (uint8_t logical_destination, uint8_t vector) |
Send an Inter-Processor Interrupt (IPI) to a group of processors. | |
void | sendAll (uint8_t vector) |
Send an Inter-Processor Interrupt (IPI) to all processors (including self) | |
void | sendOthers (uint8_t vector) |
Send an Inter-Processor Interrupt (IPI) to all other processors (all but self) | |
void | sendInit (bool assert=true) |
Send an INIT request IPI to all other processors. | |
void | sendStartup (uint8_t vector) |
Send an Startup IPI to all other processors. | |
Inter-Processor Interrupts.
For multi-core systems, the LAPIC enables sending messages (Inter-Processor Interrupts, IPIs) to other CPU cores and receiving those sent from other cores.
Delivery mode specifies the type of interrupt sent to the CPU.
Enumerator | |
---|---|
FIXED | "ordinary" interrupt; send to ALL cores listed in the destination bit mask |
LOWEST_PRIORITY | "ordinary" interrupt; send to the lowest priority core from destination mask |
SMI | System Management Interrupt; vector number required to be 0. |
NMI | Non-Maskable Interrupt, vector number ignored, only edge triggered. |
INIT | Initialization interrupt (always treated as edge triggered) |
INIT_LEVEL_DEASSERT | Synchronization interrupt. |
STARTUP | Dedicated Startup-Interrupt (SIPI) |
Interrupt state.
Enumerator | |
---|---|
IDLE | No activity for this interrupt. |
SEND_PENDING | Interrupt will be sent as soon as the bus / LAPIC is ready. |
enum LAPIC::IPI::Level |
Interrupt level.
Enumerator | |
---|---|
DEASSERT | Must be zero when DeliveryMode::INIT_LEVEL_DEASSERT. |
ASSERT | Must be one for all other delivery modes. |
Trigger mode for DeliveryMode::INIT_LEVEL_DEASSERT.
Enumerator | |
---|---|
EDGE_TRIGGERED | edge triggered |
LEVEL_TRIGGERED | level triggered |
bool LAPIC::IPI::isDelivered | ( | ) |
void LAPIC::IPI::send | ( | uint8_t | destination, |
uint8_t | vector | ||
) |
Send an Inter-Processor Interrupt (IPI)
destination | ID of the target processor (use APIC::getLAPICID(core) ) |
vector | Interrupt vector number to be triggered |
void LAPIC::IPI::sendAll | ( | uint8_t | vector | ) |
Send an Inter-Processor Interrupt (IPI) to all processors (including self)
vector | Interrupt vector number to be triggered |
void LAPIC::IPI::sendGroup | ( | uint8_t | logical_destination, |
uint8_t | vector | ||
) |
void LAPIC::IPI::sendInit | ( | bool | assert = true | ) |
Send an INIT request IPI to all other processors.
assert | if true send an INIT, on false send an INIT Level De-assert |
void LAPIC::IPI::sendOthers | ( | uint8_t | vector | ) |
Send an Inter-Processor Interrupt (IPI) to all other processors (all but self)
vector | Interrupt vector number to be triggered |
void LAPIC::IPI::sendStartup | ( | uint8_t | vector | ) |
Send an Startup IPI to all other processors.
vector | Pointer to a startup routine |