The Pedigree Project 0.1
Classes | Public Types | Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | List of all members
IrqHandlerRegistry Class Reference

#include <IrqHandlerRegistry.h>

+ Collaboration diagram for IrqHandlerRegistry:

Classes

struct  ActiveDispatch
 
struct  AdmissionCutoff
 
struct  AdmissionCutoffCleanup
 
struct  DispatchCleanup
 
struct  HandlerSlot
 
struct  LineConfiguration
 
struct  MixedAdmissionCutoffs
 
struct  ThreadedActionMutationCleanup
 
struct  ThreadedDispatchResult
 

Public Types

enum class  UnregisterResult { Completed , Deferred , Rejected , NotFound }
 
enum class  LineMode { Empty , Threaded , HardOnly , Mixed }
 

Public Member Functions

bool registerThreadedHandler (uint8_t irq, IrqHandler *handler)
 
bool registerThreadedHandler (uint8_t irq, IrqHandler *handler, const IrqPolicy &policy)
 
bool registerHardHandler (uint8_t irq, HardIrqHandler *handler)
 
bool registerHardHandler (uint8_t irq, HardIrqHandler *handler, const IrqPolicy &policy)
 
UnregisterResult unregisterHandler (uint8_t irq, IrqHandlerBase *handler)
 
UnregisterResult unregisterHandler (uint8_t irq, IrqHandlerBase *handler, LineMode &removedDelivery)
 
bool dispatchHard (uint8_t irq, InterruptState &state, HardIrqDisposition &disposition, HardIrqHandler *onlyHandler=nullptr, size_t dispatchGeneration=0)
 
bool dispatchHard (uint8_t irq, InterruptState &state, HardIrqDisposition &disposition, HardIrqHandler *onlyHandler, size_t dispatchGeneration, AdmissionCutoff admissionCutoff)
 
bool hardLineQuarantined (uint8_t irq) const
 
bool publishThreadedDispatch (uint8_t irq, size_t dispatchGeneration)
 
bool publishThreadedDispatch (uint8_t irq, size_t dispatchGeneration, AdmissionCutoff admissionCutoff)
 
bool captureAdmissionCutoff (uint8_t irq, AdmissionCutoff &cutoff)
 
bool captureMixedAdmissionCutoffs (uint8_t irq, MixedAdmissionCutoffs &cutoffs)
 
void releaseAdmissionCutoff (AdmissionCutoff admissionCutoff)
 
void invalidateThreadedLine (uint8_t irq, size_t throughGeneration)
 
void invalidateThreadedGenerationFromInterrupt (uint8_t irq, size_t throughGeneration)
 
bool dispatchThreaded (uint8_t irq, size_t dispatchGeneration, ThreadedDispatchResult &result, IrqHandler *onlyHandler=nullptr)
 
size_t handlerCount (uint8_t irq)
 
LineMode lineMode (uint8_t irq)
 
bool snapshotLineConfiguration (uint8_t irq, LineConfiguration &configuration) const
 
size_t hardDispatchState (uint8_t irq, size_t &exactGeneration) const
 
size_t threadedDispatchState (uint8_t irq, uintptr_t &exactHandlerIdentity) const
 

Private Types

enum class  Delivery : size_t { Threaded , HardOnly }
 
enum class  SlotMode : size_t {
  Empty = 0 , Enabled , Draining , Cancelling ,
  Closed , Retiring , Tombstone
}
 
enum class  QuiescedLane : size_t { Controller , Callback , Retirement , Count }
 

Private Member Functions

bool registerHandler (uint8_t irq, IrqHandlerBase *handler, Delivery delivery, size_t policy)
 
bool acquireOccurrenceReaderLeases (uint8_t irq, size_t readerBank, size_t count)
 
void releaseOccurrenceReaderLeases (uint8_t irq, size_t readerBank, size_t count)
 
void beginAdmissionCutoffCleanup (AdmissionCutoffCleanup &cleanup)
 
void finishAdmissionCutoffCleanup (AdmissionCutoffCleanup &cleanup)
 
void beginMutation ()
 
void finishMutation ()
 
void beginThreadedActionMutation (ThreadedActionMutationCleanup &cleanup)
 
void finishThreadedActionMutation (ThreadedActionMutationCleanup &cleanup)
 
void completeThreadedActionMutation ()
 
bool retireSlot (HandlerSlot &slot, size_t expectedPublication, IrqHandlerBase *expectedHandler)
 
bool retireSlotOrObserveClosed (HandlerSlot &slot, size_t expectedPublication, IrqHandlerBase *expectedHandler)
 
bool closeSlotAdmission (HandlerSlot &slot, size_t expectedPublication, size_t &closedPublication)
 
void tryReclaimTombstones (uint8_t irq)
 
bool occurrencePrecedesRetirement (const HandlerSlot &slot, AdmissionCutoff admissionCutoff) const
 
ActiveDispatchpublishDispatch (HandlerSlot &slot, void *owner, void *token, size_t admittedPublication, size_t controllerGeneration, bool callback=true)
 
bool unpublishDispatch (void *token, HandlerSlot &slot, size_t admittedPublication, bool required)
 
bool acquireFinalizationGate (HandlerSlot &slot, bool canWait)
 
bool pinActionMutation (HandlerSlot &slot, size_t publication, DispatchCleanup &cleanup, Thread *thread)
 
void unpinActionMutation (HandlerSlot &slot, size_t publication, DispatchCleanup &cleanup, Thread *thread)
 
bool hasActiveDispatch (HandlerSlot &slot, size_t admittedPublication) const
 
bool findCurrentDispatch (void *owner, HandlerSlot *target, size_t targetPublication, bool &callbackContext) const
 
bool threadedGenerationValid (uint8_t irq, size_t generation) const
 
void publishSlotQuiesced (HandlerSlot &slot, uint8_t irq, size_t dispatchGeneration, QuiescedLane lane)
 
void publishSlotQuiescedValue (HandlerSlot &slot, uint8_t irq, size_t dispatchGeneration, QuiescedLane lane)
 

Static Private Member Functions

static size_t makePublication (size_t generation, uint8_t irq, SlotMode mode, Delivery delivery)
 
static size_t generationOf (size_t publication)
 
static uint8_t irqOf (size_t publication)
 
static SlotMode modeOf (size_t publication)
 
static Delivery deliveryOf (size_t publication)
 
static bool generationReached (size_t current, size_t target)
 
static size_t encodePolicy (const IrqPolicy *policy)
 
static void decodePolicy (size_t policy, LineConfiguration &configuration)
 
static bool mixedPoliciesCompatible (size_t first, size_t second)
 
static size_t effectiveMixedPolicy (size_t hard, size_t threaded)
 
static LineMode lineModeForDelivery (Delivery delivery)
 
static void abandonAdmissionCutoff (void *context)
 
static void abandonThreadedActionMutation (void *context)
 
static void abandonDispatch (void *context)
 
static void restoreDispatchInterruptState (DispatchCleanup &dispatch)
 
static bool canWaitForActionFinalization ()
 
static void releaseFinalizationGate (HandlerSlot &slot)
 
static void * currentDispatchOwner ()
 
static size_t * quiescedLane (HandlerSlot &slot, QuiescedLane lane)
 
static const size_t * quiescedLane (const HandlerSlot &slot, QuiescedLane lane)
 
static bool hasQuiescedGeneration (const HandlerSlot &slot)
 

Private Attributes

HandlerSlot m_Handlers [MaxHandlerSlots]
 
ActiveDispatch m_ActiveDispatches [MaxActiveDispatches]
 
size_t m_HardHandoffEpochs [GraceBucketCount]
 
size_t m_ThreadedInvalidationGenerations [IrqCount]
 
size_t m_ThreadedActionMutationGeneration
 
size_t m_ThreadedActionMutationWriters
 
size_t m_OccurrenceEpochs [GraceBucketCount]
 
size_t m_OccurrenceReaders [GraceBucketCount][2]
 
size_t m_OccurrenceBoundaryLocks [GraceBucketCount]
 
Spinlock m_HandlerLock
 
size_t m_AdmissionEpoch
 
size_t m_MutationGeneration
 
size_t m_MutationWriters
 

Static Private Attributes

static constexpr size_t MaxHandlerSlots = 64
 
static constexpr size_t MaxActiveDispatches = 64
 
static constexpr size_t IrqCount = 256
 
static constexpr size_t GraceBucketCount = 16
 
static constexpr uint8_t InvalidIrq = 0xFF
 
static constexpr size_t QuiescedLaneCount = static_cast<size_t>(QuiescedLane::Count)
 
static constexpr size_t ModeBits = 3
 
static constexpr size_t ModeMask = (1 << ModeBits) - 1
 
static constexpr size_t DeliveryBits = 1
 
static constexpr size_t DeliveryShift = ModeBits
 
static constexpr size_t DeliveryMask = ((1 << DeliveryBits) - 1) << DeliveryShift
 
static constexpr size_t IrqShift = DeliveryShift + DeliveryBits
 
static constexpr size_t IrqMask = 0xFF << IrqShift
 
static constexpr size_t GenerationShift = IrqShift + 8
 
static constexpr size_t MaximumPublicationGeneration = ~static_cast<size_t>(0) >> GenerationShift
 
static constexpr size_t PolicyValid = 1U << 0
 
static constexpr size_t PolicyTriggerShift = 1
 
static constexpr size_t PolicyControllerAckShift = 3
 
static constexpr size_t PolicyLineReleaseShift = 5
 
static constexpr size_t PolicyTriggerMask = 3U << PolicyTriggerShift
 
static constexpr size_t PolicyControllerAckMask = 3U << PolicyControllerAckShift
 
static constexpr size_t PolicyLineReleaseMask = 1U << PolicyLineReleaseShift
 
static constexpr size_t PolicyMixedCompatibilityMask
 
static constexpr size_t LineSnapshotAttempts = 2
 

Detailed Description

Allocation-free IRQ callback registry with synchronous removal.

Dispatch never takes the registry's writer lock. It pins an atomically published slot and revalidates that publication before entering the callback. Removal first closes admission and then drains callbacks which committed their pins before that transition. Callback release only clears atomic hazard state; a synchronous unregistering thread owns any cooperative scheduling needed while it rechecks the drain predicate.

Definition at line 35 of file IrqHandlerRegistry.h.

Member Enumeration Documentation

◆ Delivery

enum class IrqHandlerRegistry::Delivery : size_t
strongprivate

Definition at line 281 of file IrqHandlerRegistry.h.

◆ LineMode

enum class IrqHandlerRegistry::LineMode
strong

Definition at line 60 of file IrqHandlerRegistry.h.

◆ QuiescedLane

enum class IrqHandlerRegistry::QuiescedLane : size_t
strongprivate

Definition at line 303 of file IrqHandlerRegistry.h.

◆ SlotMode

enum class IrqHandlerRegistry::SlotMode : size_t
strongprivate

Definition at line 293 of file IrqHandlerRegistry.h.

◆ UnregisterResult

enum class IrqHandlerRegistry::UnregisterResult
strong

Definition at line 53 of file IrqHandlerRegistry.h.

Constructor & Destructor Documentation

◆ IrqHandlerRegistry()

IrqHandlerRegistry::IrqHandlerRegistry ( )

Definition at line 28 of file IrqHandlerRegistry.cc.

Member Function Documentation

◆ abandonAdmissionCutoff()

void IrqHandlerRegistry::abandonAdmissionCutoff ( void *  context)
staticprivate

Definition at line 1250 of file IrqHandlerRegistry.cc.

◆ abandonDispatch()

void IrqHandlerRegistry::abandonDispatch ( void *  context)
staticprivate

Definition at line 746 of file IrqHandlerRegistry.cc.

◆ abandonThreadedActionMutation()

void IrqHandlerRegistry::abandonThreadedActionMutation ( void *  context)
staticprivate

Definition at line 325 of file IrqHandlerRegistry.cc.

◆ acquireFinalizationGate()

bool IrqHandlerRegistry::acquireFinalizationGate ( HandlerSlot slot,
bool  canWait 
)
private

Definition at line 345 of file IrqHandlerRegistry.cc.

◆ acquireOccurrenceReaderLeases()

bool IrqHandlerRegistry::acquireOccurrenceReaderLeases ( uint8_t  irq,
size_t  readerBank,
size_t  count 
)
private

Definition at line 1165 of file IrqHandlerRegistry.cc.

◆ beginAdmissionCutoffCleanup()

void IrqHandlerRegistry::beginAdmissionCutoffCleanup ( AdmissionCutoffCleanup cleanup)
private

Definition at line 1220 of file IrqHandlerRegistry.cc.

◆ beginMutation()

void IrqHandlerRegistry::beginMutation ( )
private

Definition at line 280 of file IrqHandlerRegistry.cc.

◆ beginThreadedActionMutation()

void IrqHandlerRegistry::beginThreadedActionMutation ( ThreadedActionMutationCleanup cleanup)
private

Definition at line 293 of file IrqHandlerRegistry.cc.

◆ canWaitForActionFinalization()

bool IrqHandlerRegistry::canWaitForActionFinalization ( )
staticprivate

Definition at line 336 of file IrqHandlerRegistry.cc.

◆ captureAdmissionCutoff()

bool IrqHandlerRegistry::captureAdmissionCutoff ( uint8_t  irq,
AdmissionCutoff cutoff 
)

Captures one occurrence cutoff before controller delivery is sampled. A false return leaves cutoff empty and transfers no lease.

Definition at line 1094 of file IrqHandlerRegistry.cc.

Referenced by dispatchHard(), dispatchThreaded(), Pic::interrupt(), and publishThreadedDispatch().

+ Here is the caller graph for this function:

◆ captureMixedAdmissionCutoffs()

bool IrqHandlerRegistry::captureMixedAdmissionCutoffs ( uint8_t  irq,
MixedAdmissionCutoffs cutoffs 
)

Captures independent hard and threaded leases for one occurrence.

Each cutoff must be consumed by its dispatch operation or released separately. Both leases have the same occurrence and admission epochs. A false return leaves both cutoffs empty and transfers no leases.

Definition at line 1131 of file IrqHandlerRegistry.cc.

Referenced by Pic::interrupt().

+ Here is the caller graph for this function:

◆ closeSlotAdmission()

bool IrqHandlerRegistry::closeSlotAdmission ( HandlerSlot slot,
size_t  expectedPublication,
size_t &  closedPublication 
)
private

Definition at line 401 of file IrqHandlerRegistry.cc.

◆ completeThreadedActionMutation()

void IrqHandlerRegistry::completeThreadedActionMutation ( )
private

Definition at line 315 of file IrqHandlerRegistry.cc.

◆ currentDispatchOwner()

void * IrqHandlerRegistry::currentDispatchOwner ( )
staticprivate

Definition at line 829 of file IrqHandlerRegistry.cc.

◆ decodePolicy()

void IrqHandlerRegistry::decodePolicy ( size_t  policy,
LineConfiguration configuration 
)
staticprivate

Definition at line 248 of file IrqHandlerRegistry.cc.

◆ deliveryOf()

IrqHandlerRegistry::Delivery IrqHandlerRegistry::deliveryOf ( size_t  publication)
staticprivate

Definition at line 71 of file IrqHandlerRegistry.cc.

◆ dispatchHard() [1/2]

bool IrqHandlerRegistry::dispatchHard ( uint8_t  irq,
InterruptState &  state,
HardIrqDisposition disposition,
HardIrqHandler onlyHandler,
size_t  dispatchGeneration,
AdmissionCutoff  admissionCutoff 
)

Definition at line 1261 of file IrqHandlerRegistry.cc.

◆ dispatchHard() [2/2]

bool IrqHandlerRegistry::dispatchHard ( uint8_t  irq,
InterruptState &  state,
HardIrqDisposition disposition,
HardIrqHandler onlyHandler = nullptr,
size_t  dispatchGeneration = 0 
)

Dispatches all enabled handlers for an IRQ.

Returns true if at least one callback was admitted. disposition aggregates callback results, with KeepMasked dominating Handled and Handled dominating NotHandled.

Definition at line 1083 of file IrqHandlerRegistry.cc.

References captureAdmissionCutoff(), and dispatchHard().

Referenced by dispatchHard(), and Pic::interrupt().

+ Here is the caller graph for this function:

◆ dispatchThreaded()

bool IrqHandlerRegistry::dispatchThreaded ( uint8_t  irq,
size_t  dispatchGeneration,
ThreadedDispatchResult result,
IrqHandler onlyHandler = nullptr 
)

Dispatches handlers admitted by publishThreadedDispatch() without exposing interrupted state.

Returns true when at least one callback was admitted and writes the detached callback outcome to result.

A Quiesced callback permits line rearm but remains distinct from a callback which actually handled the occurrence.

Definition at line 1647 of file IrqHandlerRegistry.cc.

References captureAdmissionCutoff(), ProcessorBase::getInterrupts(), ProcessorBase::information(), Scheduler::instance(), Quiesced, ProcessorBase::setInterrupts(), and Scheduler::yield().

◆ effectiveMixedPolicy()

size_t IrqHandlerRegistry::effectiveMixedPolicy ( size_t  hard,
size_t  threaded 
)
staticprivate

Definition at line 268 of file IrqHandlerRegistry.cc.

◆ encodePolicy()

size_t IrqHandlerRegistry::encodePolicy ( const IrqPolicy policy)
staticprivate

Definition at line 238 of file IrqHandlerRegistry.cc.

◆ findCurrentDispatch()

bool IrqHandlerRegistry::findCurrentDispatch ( void *  owner,
HandlerSlot target,
size_t  targetPublication,
bool &  callbackContext 
) const
private

Definition at line 798 of file IrqHandlerRegistry.cc.

◆ finishAdmissionCutoffCleanup()

void IrqHandlerRegistry::finishAdmissionCutoffCleanup ( AdmissionCutoffCleanup cleanup)
private

Definition at line 1234 of file IrqHandlerRegistry.cc.

◆ finishMutation()

void IrqHandlerRegistry::finishMutation ( )
private

Definition at line 286 of file IrqHandlerRegistry.cc.

◆ finishThreadedActionMutation()

void IrqHandlerRegistry::finishThreadedActionMutation ( ThreadedActionMutationCleanup cleanup)
private

Definition at line 304 of file IrqHandlerRegistry.cc.

◆ generationOf()

size_t IrqHandlerRegistry::generationOf ( size_t  publication)
staticprivate

Definition at line 59 of file IrqHandlerRegistry.cc.

◆ generationReached()

bool IrqHandlerRegistry::generationReached ( size_t  current,
size_t  target 
)
staticprivate

Definition at line 75 of file IrqHandlerRegistry.cc.

◆ handlerCount()

size_t IrqHandlerRegistry::handlerCount ( uint8_t  irq)

Definition at line 1947 of file IrqHandlerRegistry.cc.

◆ hardDispatchState()

size_t IrqHandlerRegistry::hardDispatchState ( uint8_t  irq,
size_t &  exactGeneration 
) const

Lock-free debugger query for committed hard callbacks on one line.

Returns the active count and writes the exact controller generation only when one callback is active. Multiple callbacks make the generation ambiguous and write zero.

Definition at line 2062 of file IrqHandlerRegistry.cc.

Referenced by Pic::snapshotIrqLines().

+ Here is the caller graph for this function:

◆ hardLineQuarantined()

bool IrqHandlerRegistry::hardLineQuarantined ( uint8_t  irq) const

Reports a sticky KeepMasked result from any live hard source.

Definition at line 1425 of file IrqHandlerRegistry.cc.

References IrqHandlerRegistry::HandlerSlot::hardHandoffState, and m_HardHandoffEpochs.

◆ hasActiveDispatch()

bool IrqHandlerRegistry::hasActiveDispatch ( HandlerSlot slot,
size_t  admittedPublication 
) const
private

Definition at line 777 of file IrqHandlerRegistry.cc.

◆ hasQuiescedGeneration()

bool IrqHandlerRegistry::hasQuiescedGeneration ( const HandlerSlot slot)
staticprivate

Definition at line 101 of file IrqHandlerRegistry.cc.

◆ invalidateThreadedGenerationFromInterrupt()

void IrqHandlerRegistry::invalidateThreadedGenerationFromInterrupt ( uint8_t  irq,
size_t  throughGeneration 
)

Invalidates a generation in bounded hard-IRQ context.

The controller serialises this with publication for the physical line. Token and tombstone cleanup is deferred to workers or full line invalidation.

Definition at line 164 of file IrqHandlerRegistry.cc.

◆ invalidateThreadedLine()

void IrqHandlerRegistry::invalidateThreadedLine ( uint8_t  irq,
size_t  throughGeneration 
)

Invalidates queued threaded work from an ended controller lifetime.

Definition at line 179 of file IrqHandlerRegistry.cc.

References ProcessorBase::information().

Referenced by Pic::shutdownThreaded().

+ Here is the caller graph for this function:

◆ irqOf()

uint8_t IrqHandlerRegistry::irqOf ( size_t  publication)
staticprivate

Definition at line 63 of file IrqHandlerRegistry.cc.

◆ lineMode()

IrqHandlerRegistry::LineMode IrqHandlerRegistry::lineMode ( uint8_t  irq)

Returns the delivery type of an enabled physical line.

Definition at line 1959 of file IrqHandlerRegistry.cc.

◆ lineModeForDelivery()

IrqHandlerRegistry::LineMode IrqHandlerRegistry::lineModeForDelivery ( Delivery  delivery)
staticprivate

Definition at line 276 of file IrqHandlerRegistry.cc.

◆ makePublication()

size_t IrqHandlerRegistry::makePublication ( size_t  generation,
uint8_t  irq,
SlotMode  mode,
Delivery  delivery 
)
staticprivate

Definition at line 53 of file IrqHandlerRegistry.cc.

◆ mixedPoliciesCompatible()

bool IrqHandlerRegistry::mixedPoliciesCompatible ( size_t  first,
size_t  second 
)
staticprivate

Definition at line 260 of file IrqHandlerRegistry.cc.

◆ modeOf()

IrqHandlerRegistry::SlotMode IrqHandlerRegistry::modeOf ( size_t  publication)
staticprivate

Definition at line 67 of file IrqHandlerRegistry.cc.

◆ occurrencePrecedesRetirement()

bool IrqHandlerRegistry::occurrencePrecedesRetirement ( const HandlerSlot slot,
AdmissionCutoff  admissionCutoff 
) const
private

Definition at line 493 of file IrqHandlerRegistry.cc.

◆ pinActionMutation()

bool IrqHandlerRegistry::pinActionMutation ( HandlerSlot slot,
size_t  publication,
DispatchCleanup cleanup,
Thread thread 
)
private

Definition at line 374 of file IrqHandlerRegistry.cc.

◆ publishDispatch()

IrqHandlerRegistry::ActiveDispatch * IrqHandlerRegistry::publishDispatch ( HandlerSlot slot,
void *  owner,
void *  token,
size_t  admittedPublication,
size_t  controllerGeneration,
bool  callback = true 
)
private

Definition at line 613 of file IrqHandlerRegistry.cc.

◆ publishSlotQuiesced()

void IrqHandlerRegistry::publishSlotQuiesced ( HandlerSlot slot,
uint8_t  irq,
size_t  dispatchGeneration,
QuiescedLane  lane 
)
private

Definition at line 110 of file IrqHandlerRegistry.cc.

◆ publishSlotQuiescedValue()

void IrqHandlerRegistry::publishSlotQuiescedValue ( HandlerSlot slot,
uint8_t  irq,
size_t  dispatchGeneration,
QuiescedLane  lane 
)
private

Definition at line 127 of file IrqHandlerRegistry.cc.

◆ publishThreadedDispatch() [1/2]

bool IrqHandlerRegistry::publishThreadedDispatch ( uint8_t  irq,
size_t  dispatchGeneration 
)

Records the exact threaded-handler publications admitted for one physical occurrence.

The nonzero generation is supplied again by the line worker. Repeated occurrences may coalesce to the newest generation, but a handler which was registered after this call is never admitted retroactively. A controller serializes publication and invalidation for each physical line; worker consumption remains concurrent.

Definition at line 1463 of file IrqHandlerRegistry.cc.

References captureAdmissionCutoff(), and publishThreadedDispatch().

Referenced by Pic::interrupt(), and publishThreadedDispatch().

+ Here is the caller graph for this function:

◆ publishThreadedDispatch() [2/2]

bool IrqHandlerRegistry::publishThreadedDispatch ( uint8_t  irq,
size_t  dispatchGeneration,
AdmissionCutoff  admissionCutoff 
)

Definition at line 1471 of file IrqHandlerRegistry.cc.

◆ quiescedLane() [1/2]

const size_t * IrqHandlerRegistry::quiescedLane ( const HandlerSlot slot,
QuiescedLane  lane 
)
staticprivate

Definition at line 95 of file IrqHandlerRegistry.cc.

◆ quiescedLane() [2/2]

size_t * IrqHandlerRegistry::quiescedLane ( HandlerSlot slot,
QuiescedLane  lane 
)
staticprivate

Definition at line 89 of file IrqHandlerRegistry.cc.

◆ registerHandler()

bool IrqHandlerRegistry::registerHandler ( uint8_t  irq,
IrqHandlerBase handler,
Delivery  delivery,
size_t  policy 
)
private

Definition at line 835 of file IrqHandlerRegistry.cc.

◆ registerHardHandler() [1/2]

bool IrqHandlerRegistry::registerHardHandler ( uint8_t  irq,
HardIrqHandler handler 
)

Publishes an explicit hard-IRQ handler.

Definition at line 915 of file IrqHandlerRegistry.cc.

Referenced by Pic::registerHardIsaIrqHandler(), and Pic::registerHardPciIrqHandler().

+ Here is the caller graph for this function:

◆ registerHardHandler() [2/2]

bool IrqHandlerRegistry::registerHardHandler ( uint8_t  irq,
HardIrqHandler handler,
const IrqPolicy policy 
)

Publishes a typed hard-IRQ handler and line policy.

Definition at line 919 of file IrqHandlerRegistry.cc.

◆ registerThreadedHandler() [1/2]

bool IrqHandlerRegistry::registerThreadedHandler ( uint8_t  irq,
IrqHandler handler 
)

Publishes an ordinary thread-context handler.

Definition at line 905 of file IrqHandlerRegistry.cc.

Referenced by Pic::registerIsaIrqHandler(), and Pic::registerPciIrqHandler().

+ Here is the caller graph for this function:

◆ registerThreadedHandler() [2/2]

bool IrqHandlerRegistry::registerThreadedHandler ( uint8_t  irq,
IrqHandler handler,
const IrqPolicy policy 
)

Publishes a typed thread-context handler and line policy.

Definition at line 909 of file IrqHandlerRegistry.cc.

◆ releaseAdmissionCutoff()

void IrqHandlerRegistry::releaseAdmissionCutoff ( AdmissionCutoff  admissionCutoff)

Releases a cutoff which was not consumed by a dispatch operation.

Definition at line 1205 of file IrqHandlerRegistry.cc.

◆ releaseFinalizationGate()

void IrqHandlerRegistry::releaseFinalizationGate ( HandlerSlot slot)
staticprivate

Definition at line 370 of file IrqHandlerRegistry.cc.

◆ releaseOccurrenceReaderLeases()

void IrqHandlerRegistry::releaseOccurrenceReaderLeases ( uint8_t  irq,
size_t  readerBank,
size_t  count 
)
private

Definition at line 1183 of file IrqHandlerRegistry.cc.

◆ restoreDispatchInterruptState()

void IrqHandlerRegistry::restoreDispatchInterruptState ( DispatchCleanup dispatch)
staticprivate

Definition at line 767 of file IrqHandlerRegistry.cc.

◆ retireSlot()

bool IrqHandlerRegistry::retireSlot ( HandlerSlot slot,
size_t  expectedPublication,
IrqHandlerBase expectedHandler 
)
private

Definition at line 544 of file IrqHandlerRegistry.cc.

◆ retireSlotOrObserveClosed()

bool IrqHandlerRegistry::retireSlotOrObserveClosed ( HandlerSlot slot,
size_t  expectedPublication,
IrqHandlerBase expectedHandler 
)
private

Definition at line 600 of file IrqHandlerRegistry.cc.

◆ snapshotLineConfiguration()

bool IrqHandlerRegistry::snapshotLineConfiguration ( uint8_t  irq,
LineConfiguration configuration 
) const

Takes a bounded lock-free snapshot of one line's admitted configuration.

A false return means a concurrent mutation outlived both bounded attempts; callers may leave observational state stale and try again later.

Definition at line 1981 of file IrqHandlerRegistry.cc.

◆ threadedDispatchState()

size_t IrqHandlerRegistry::threadedDispatchState ( uint8_t  irq,
uintptr_t &  exactHandlerIdentity 
) const

Lock-free debugger query for committed threaded callbacks on one line.

The committed pin includes the bounded setup and cleanup immediately around the virtual call. Returns the active count and writes the exact handler identity only when one pin is active. Multiple callbacks make the identity ambiguous and write zero.

Definition at line 2088 of file IrqHandlerRegistry.cc.

Referenced by Pic::snapshotIrqLines().

+ Here is the caller graph for this function:

◆ threadedGenerationValid()

bool IrqHandlerRegistry::threadedGenerationValid ( uint8_t  irq,
size_t  generation 
) const
private

Definition at line 79 of file IrqHandlerRegistry.cc.

◆ tryReclaimTombstones()

void IrqHandlerRegistry::tryReclaimTombstones ( uint8_t  irq)
private

Definition at line 499 of file IrqHandlerRegistry.cc.

◆ unpinActionMutation()

void IrqHandlerRegistry::unpinActionMutation ( HandlerSlot slot,
size_t  publication,
DispatchCleanup cleanup,
Thread thread 
)
private

Definition at line 393 of file IrqHandlerRegistry.cc.

◆ unpublishDispatch()

bool IrqHandlerRegistry::unpublishDispatch ( void *  token,
HandlerSlot slot,
size_t  admittedPublication,
bool  required 
)
private

Definition at line 664 of file IrqHandlerRegistry.cc.

◆ unregisterHandler() [1/2]

IrqHandlerRegistry::UnregisterResult IrqHandlerRegistry::unregisterHandler ( uint8_t  irq,
IrqHandlerBase handler 
)

Stops future callbacks and drains callbacks already in progress.

Self-removal cannot synchronously drain its own callback and is deferred until that callback returns. Atomic contexts reject a removal which would otherwise have to wait. A synchronous caller must not retain a resource which the active handler needs to finish.

The device source must be masked or quiesced before this call. Removal closes and drains registry admission; it cannot stop hardware from raising a new occurrence.

Definition at line 925 of file IrqHandlerRegistry.cc.

References unregisterHandler().

Referenced by Pic::unregisterHandler(), and unregisterHandler().

+ Here is the caller graph for this function:

◆ unregisterHandler() [2/2]

IrqHandlerRegistry::UnregisterResult IrqHandlerRegistry::unregisterHandler ( uint8_t  irq,
IrqHandlerBase handler,
LineMode &  removedDelivery 
)

Also reports the exact delivery of the slot whose admission was closed.

removedDelivery is Empty when no matching slot was found and is never Mixed: each registry slot retains one private delivery bit.

Definition at line 931 of file IrqHandlerRegistry.cc.

References Spinlock::acquire(), Thread::getDebugState(), ProcessorBase::getInterrupts(), ProcessorBase::information(), Scheduler::instance(), Spinlock::release(), Thread::setDebugState(), and Scheduler::yield().

Member Data Documentation

◆ DeliveryBits

constexpr size_t IrqHandlerRegistry::DeliveryBits = 1
staticconstexprprivate

Definition at line 314 of file IrqHandlerRegistry.h.

◆ DeliveryMask

constexpr size_t IrqHandlerRegistry::DeliveryMask = ((1 << DeliveryBits) - 1) << DeliveryShift
staticconstexprprivate

Definition at line 316 of file IrqHandlerRegistry.h.

◆ DeliveryShift

constexpr size_t IrqHandlerRegistry::DeliveryShift = ModeBits
staticconstexprprivate

Definition at line 315 of file IrqHandlerRegistry.h.

◆ GenerationShift

constexpr size_t IrqHandlerRegistry::GenerationShift = IrqShift + 8
staticconstexprprivate

Definition at line 319 of file IrqHandlerRegistry.h.

◆ GraceBucketCount

constexpr size_t IrqHandlerRegistry::GraceBucketCount = 16
staticconstexprprivate

Definition at line 290 of file IrqHandlerRegistry.h.

◆ InvalidIrq

constexpr uint8_t IrqHandlerRegistry::InvalidIrq = 0xFF
staticconstexprprivate

Definition at line 291 of file IrqHandlerRegistry.h.

◆ IrqCount

constexpr size_t IrqHandlerRegistry::IrqCount = 256
staticconstexprprivate

Definition at line 288 of file IrqHandlerRegistry.h.

◆ IrqMask

constexpr size_t IrqHandlerRegistry::IrqMask = 0xFF << IrqShift
staticconstexprprivate

Definition at line 318 of file IrqHandlerRegistry.h.

◆ IrqShift

constexpr size_t IrqHandlerRegistry::IrqShift = DeliveryShift + DeliveryBits
staticconstexprprivate

Definition at line 317 of file IrqHandlerRegistry.h.

◆ LineSnapshotAttempts

constexpr size_t IrqHandlerRegistry::LineSnapshotAttempts = 2
staticconstexprprivate

Definition at line 331 of file IrqHandlerRegistry.h.

◆ m_ActiveDispatches

ActiveDispatch IrqHandlerRegistry::m_ActiveDispatches[MaxActiveDispatches]
private

Definition at line 486 of file IrqHandlerRegistry.h.

◆ m_AdmissionEpoch

size_t IrqHandlerRegistry::m_AdmissionEpoch
private

Definition at line 496 of file IrqHandlerRegistry.h.

◆ m_HandlerLock

Spinlock IrqHandlerRegistry::m_HandlerLock
private

Definition at line 495 of file IrqHandlerRegistry.h.

◆ m_Handlers

HandlerSlot IrqHandlerRegistry::m_Handlers[MaxHandlerSlots]
private

Definition at line 485 of file IrqHandlerRegistry.h.

◆ m_HardHandoffEpochs

size_t IrqHandlerRegistry::m_HardHandoffEpochs[GraceBucketCount]
private

Makes the bounded per-line hard-veto scan coherent across mutations.

Definition at line 488 of file IrqHandlerRegistry.h.

Referenced by hardLineQuarantined().

◆ m_MutationGeneration

size_t IrqHandlerRegistry::m_MutationGeneration
private

Definition at line 497 of file IrqHandlerRegistry.h.

◆ m_MutationWriters

size_t IrqHandlerRegistry::m_MutationWriters
private

Definition at line 498 of file IrqHandlerRegistry.h.

◆ m_OccurrenceBoundaryLocks

size_t IrqHandlerRegistry::m_OccurrenceBoundaryLocks[GraceBucketCount]
private

Definition at line 494 of file IrqHandlerRegistry.h.

◆ m_OccurrenceEpochs

size_t IrqHandlerRegistry::m_OccurrenceEpochs[GraceBucketCount]
private

Definition at line 492 of file IrqHandlerRegistry.h.

◆ m_OccurrenceReaders

size_t IrqHandlerRegistry::m_OccurrenceReaders[GraceBucketCount][2]
private

Definition at line 493 of file IrqHandlerRegistry.h.

◆ m_ThreadedActionMutationGeneration

size_t IrqHandlerRegistry::m_ThreadedActionMutationGeneration
private

Definition at line 490 of file IrqHandlerRegistry.h.

◆ m_ThreadedActionMutationWriters

size_t IrqHandlerRegistry::m_ThreadedActionMutationWriters
private

Definition at line 491 of file IrqHandlerRegistry.h.

◆ m_ThreadedInvalidationGenerations

size_t IrqHandlerRegistry::m_ThreadedInvalidationGenerations[IrqCount]
private

Definition at line 489 of file IrqHandlerRegistry.h.

◆ MaxActiveDispatches

constexpr size_t IrqHandlerRegistry::MaxActiveDispatches = 64
staticconstexprprivate

Definition at line 287 of file IrqHandlerRegistry.h.

◆ MaxHandlerSlots

constexpr size_t IrqHandlerRegistry::MaxHandlerSlots = 64
staticconstexprprivate

Definition at line 286 of file IrqHandlerRegistry.h.

◆ MaximumPublicationGeneration

constexpr size_t IrqHandlerRegistry::MaximumPublicationGeneration = ~static_cast<size_t>(0) >> GenerationShift
staticconstexprprivate

Definition at line 320 of file IrqHandlerRegistry.h.

◆ ModeBits

constexpr size_t IrqHandlerRegistry::ModeBits = 3
staticconstexprprivate

Definition at line 312 of file IrqHandlerRegistry.h.

◆ ModeMask

constexpr size_t IrqHandlerRegistry::ModeMask = (1 << ModeBits) - 1
staticconstexprprivate

Definition at line 313 of file IrqHandlerRegistry.h.

◆ PolicyControllerAckMask

constexpr size_t IrqHandlerRegistry::PolicyControllerAckMask = 3U << PolicyControllerAckShift
staticconstexprprivate

Definition at line 327 of file IrqHandlerRegistry.h.

◆ PolicyControllerAckShift

constexpr size_t IrqHandlerRegistry::PolicyControllerAckShift = 3
staticconstexprprivate

Definition at line 324 of file IrqHandlerRegistry.h.

◆ PolicyLineReleaseMask

constexpr size_t IrqHandlerRegistry::PolicyLineReleaseMask = 1U << PolicyLineReleaseShift
staticconstexprprivate

Definition at line 328 of file IrqHandlerRegistry.h.

◆ PolicyLineReleaseShift

constexpr size_t IrqHandlerRegistry::PolicyLineReleaseShift = 5
staticconstexprprivate

Definition at line 325 of file IrqHandlerRegistry.h.

◆ PolicyMixedCompatibilityMask

constexpr size_t IrqHandlerRegistry::PolicyMixedCompatibilityMask
staticconstexprprivate
Initial value:
=
PolicyTriggerMask | PolicyControllerAckMask

Definition at line 329 of file IrqHandlerRegistry.h.

◆ PolicyTriggerMask

constexpr size_t IrqHandlerRegistry::PolicyTriggerMask = 3U << PolicyTriggerShift
staticconstexprprivate

Definition at line 326 of file IrqHandlerRegistry.h.

◆ PolicyTriggerShift

constexpr size_t IrqHandlerRegistry::PolicyTriggerShift = 1
staticconstexprprivate

Definition at line 323 of file IrqHandlerRegistry.h.

◆ PolicyValid

constexpr size_t IrqHandlerRegistry::PolicyValid = 1U << 0
staticconstexprprivate

Definition at line 322 of file IrqHandlerRegistry.h.

◆ QuiescedLaneCount

constexpr size_t IrqHandlerRegistry::QuiescedLaneCount = static_cast<size_t>(QuiescedLane::Count)
staticconstexprprivate

Definition at line 310 of file IrqHandlerRegistry.h.


The documentation for this class was generated from the following files: