StuBS
LAPIC::IPI Namespace Reference

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. More...
 
void send (uint8_t destination, uint8_t vector)
 Send an Inter-Processor Interrupt (IPI) More...
 
void sendGroup (uint8_t logical_destination, uint8_t vector)
 Send an Inter-Processor Interrupt (IPI) to a group of processors. More...
 
void sendAll (uint8_t vector)
 Send an Inter-Processor Interrupt (IPI) to all processors (including self) More...
 
void sendOthers (uint8_t vector)
 Send an Inter-Processor Interrupt (IPI) to all other processors (all but self) More...
 
void sendInit (bool assert=true)
 Send an INIT request IPI to all other processors. More...
 
void sendStartup (uint8_t vector)
 Send an Startup IPI to all other processors. More...
 

Detailed Description

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.

See also
ISDMv3 10.6 Issuing Interprocessor Interrupts

Enumeration Type Documentation

◆ DeliveryMode

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)

◆ DeliveryStatus

Interrupt state.

Enumerator
IDLE 

No activity for this interrupt.

SEND_PENDING 

Interrupt will be sent as soon as the bus / LAPIC is ready.

◆ DestinationMode

Way of interpreting the value written to the destination field.

Enumerator
PHYSICAL 

Destination contains the physical destination APIC ID.

LOGICAL 

Destination contains a mask of logical APIC IDs.

◆ DestinationShorthand

Shorthand for commonly used destinations.

Enumerator
NO_SHORTHAND 

Use destination field instead of shorthand.

SELF 

Send IPI to self.

ALL_INCLUDING_SELF 

Send IPI to all including self.

ALL_EXCLUDING_SELF 

Send IPI to all except self.

◆ InterruptMask

Interrupt mask.

Enumerator
UNMASKED 

Interrupt entry is active (non-masked)

MASKED 

Interrupt entry is deactivated (masked)

◆ Level

Interrupt level.

Enumerator
DEASSERT 

Must be zero when DeliveryMode::INIT_LEVEL_DEASSERT.

ASSERT 

Must be one for all other delivery modes.

◆ TriggerMode

Trigger mode for DeliveryMode::INIT_LEVEL_DEASSERT.

Enumerator
EDGE_TRIGGERED 

edge triggered

LEVEL_TRIGGERED 

level triggered

Function Documentation

◆ isDelivered()

bool LAPIC::IPI::isDelivered ( )

Check if the previously sent IPI has reached its destination.

Returns
true if the previous IPI was accepted from its target processor, otherwise false

◆ send()

void LAPIC::IPI::send ( uint8_t  destination,
uint8_t  vector 
)

Send an Inter-Processor Interrupt (IPI)

Parameters
destinationID of the target processor (use APIC::getLAPICID(core) )
vectorInterrupt vector number to be triggered

◆ sendAll()

void LAPIC::IPI::sendAll ( uint8_t  vector)

Send an Inter-Processor Interrupt (IPI) to all processors (including self)

Parameters
vectorInterrupt vector number to be triggered

◆ sendGroup()

void LAPIC::IPI::sendGroup ( uint8_t  logical_destination,
uint8_t  vector 
)

Send an Inter-Processor Interrupt (IPI) to a group of processors.

Parameters
logical_destinationMask containing the logical APIC IDs of the target processors (use APIC::getLogicalLAPICID())
vectorInterrupt vector number to be triggered

◆ sendInit()

void LAPIC::IPI::sendInit ( bool  assert = true)

Send an INIT request IPI to all other processors.

Note
Only required for startup
Parameters
assertif true send an INIT, on false send an INIT Level De-assert

◆ sendOthers()

void LAPIC::IPI::sendOthers ( uint8_t  vector)

Send an Inter-Processor Interrupt (IPI) to all other processors (all but self)

Parameters
vectorInterrupt vector number to be triggered

◆ sendStartup()

void LAPIC::IPI::sendStartup ( uint8_t  vector)

Send an Startup IPI to all other processors.

Note
Only required for startup
Parameters
vectorPointer to a startup routine