StuBS
LAPIC::IPI Namespace Reference

Inter-Processor Interrupts. More...

Classes

struct  InterruptCommand.__unnamed54__
 I/O redirection-table entry. 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

Class Documentation

◆ LAPIC::IPI::InterruptCommand.__unnamed54__

struct LAPIC::IPI::InterruptCommand.__unnamed54__

I/O redirection-table entry.

Every entry in the redirection table represents an external source of interrupts and has a size of 64 bits. Due to the I/O APIC registers being only 32 bits wide, the 64-bit value is split in two 32 bit values.

Class Members
Register value_low First, low-order register.
Register value_high Second, high-order register.

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)

◆ 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.

◆ DeliveryStatus

Interrupt state.

Enumerator
IDLE 

No activity for this interrupt.

SEND_PENDING 

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

◆ 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

◆ 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)

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

◆ 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

◆ 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

◆ 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

◆ 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

◆ 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