112 virtual void interrupt(
size_t interruptNumber, InterruptState& state);
114 static void dispatchThreadedLine(
void* context, uint8_t irq,
size_t cookie);
116 static bool promptThreadedWorker(
void* context, uint8_t line,
size_t workerProcessor);
118 static constexpr uint8_t ControllerWorkLine = PicIrqState::LineCount;
119 bool drainOnePendingControllerBatchLocked();
120 void drainPendingControllerActionsLocked();
121 void releaseControllerState();
122 void releaseControllerStateFromInterrupt();
123 bool handControllerStateToWorker();
124 void finishDeferredLineTransitionsLocked();
125 void clearControllerTemporaryMaskLocked(uint16_t restoreMask = 0xFFFF);
126 uint16_t effectiveMaskLocked()
const;
127 void beginLineTransitionLocked(uint8_t irq);
128 void finishLineTransitionLocked(uint8_t irq);
129 void finishHandlerUnregisterLocked(uint8_t irq, IrqHandlerRegistry::UnregisterResult result,
130 IrqHandlerRegistry::LineMode removedDelivery);
131 bool claimPciTriggerLocked(uint8_t irq);
132 void restorePciTriggerLocked(uint8_t irq);
133 void admitThreadedOccurrenceLocked(uint8_t irq);
136 size_t advanceThreadedCookieLocked(uint8_t irq);
137 void publishDiagnosticLineLocked(uint8_t irq);
138 void publishAllDiagnosticLinesLocked();
140 enum FailClosedReason : uint8_t {
141 HardHandoffQuarantine = 1U << 0,
142 ThreadedPublicationQuarantine = 1U << 1,
143 UnhandledQuarantine = 1U << 2,
144 ControllerContentionQuarantine = 1U << 3,
147 void eoiLocked(uint8_t irq);
148 void applyMaskLocked();
149 void setEnabledLocked(uint8_t irq,
bool enable);
150 void enable(uint8_t irq,
bool enable);
151 void enableAll(
bool enable);
161 uint16_t m_OwnedElcr;
162 uint16_t m_OriginalElcr;
186 bool m_ThreadedHardAdmitted[PicIrqState::LineCount];
188 bool m_ThreadedHardVetoRecovery[PicIrqState::LineCount];
189 size_t m_ThreadedHardVetoRecoveryGenerations[PicIrqState::LineCount];
194 size_t m_RemovalRejections[PicIrqState::LineCount];
199 size_t m_ControllerPromptFailures;
200 size_t m_ControllerPromptDestination;
201 size_t m_ControllerPromptState;