Dokumentation

LAPIC::IPI Namespace Reference

Inter-Processor Interrupts. More...

Classes

union  InterruptCommand
 Interrupt Command. More...
 

Structs

struct  InterruptCommand.__unnamed__
 

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

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)

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.

Interrupt state.

Enumerator
IDLE 

No activity for this interrupt.

SEND_PENDING 

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

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

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.

Interrupt mask.

Enumerator
UNMASKED 

Interrupt entry is active (non-masked)

MASKED 

Interrupt entry is deactivated (masked)

Function Documentation

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