20#ifndef KERNEL_MACHINE_X86_COMMON_PIC_H
21#define KERNEL_MACHINE_X86_COMMON_PIC_H
22#include "pedigree/kernel/compiler.h"
23#include "pedigree/kernel/machine/IrqDiagnosticSnapshotStore.h"
24#include "pedigree/kernel/machine/IrqHandler.h"
25#include "pedigree/kernel/machine/IrqHandlerRegistry.h"
26#include "pedigree/kernel/machine/IrqManager.h"
27#include "pedigree/kernel/machine/ThreadedIrqDispatcher.h"
28#include "pedigree/kernel/machine/types.h"
29#include "pedigree/kernel/process/Mutex.h"
30#include "pedigree/kernel/processor/InterruptHandler.h"
31#include "pedigree/kernel/processor/IoPort.h"
32#include "pedigree/kernel/processor/state_forward.h"
33#include "pedigree/kernel/processor/types.h"
34#include "pedigree/kernel/utilities/new"
38#include "PicIrqState.h"
45class PciMessageInterrupts;
46class PciIoApicInterrupts;
63 EXPORTED_PUBLIC
bool hasIoApic()
const;
64 EXPORTED_PUBLIC
bool reservePciGsi(uint32_t gsi,
bool activeLow);
77 const IrqPolicy& intxFallbackPolicy)
override;
79 irq_id_t* ids,
bool& fallbackSafe,
80 const size_t* processors =
nullptr)
override;
82 const IrqPolicy& intxFallbackPolicy)
override;
108 class HardStateGuard;
124 virtual void interrupt(
size_t interruptNumber, InterruptState& state);
126 static void dispatchThreadedLine(
void* context, uint8_t irq,
size_t cookie);
128 static bool promptThreadedWorker(
void* context, uint8_t line,
size_t workerProcessor);
130 static constexpr uint8_t ControllerWorkLine = PicIrqState::LineCount;
131 bool drainOnePendingControllerBatchLocked();
132 void drainPendingControllerActionsLocked();
133 void releaseControllerState();
134 void releaseControllerStateFromInterrupt();
135 bool handControllerStateToWorker();
136 void finishDeferredLineTransitionsLocked();
137 void clearControllerTemporaryMaskLocked(uint16_t restoreMask = 0xFFFF);
138 uint16_t effectiveMaskLocked()
const;
139 void beginLineTransitionLocked(uint8_t irq);
140 void finishLineTransitionLocked(uint8_t irq);
141 void finishHandlerUnregisterLocked(uint8_t irq, IrqHandlerRegistry::UnregisterResult result,
142 IrqHandlerRegistry::LineMode removedDelivery);
143 bool claimPciTriggerLocked(uint8_t irq);
144 void restorePciTriggerLocked(uint8_t irq);
145 void admitThreadedOccurrenceLocked(uint8_t irq);
148 size_t advanceThreadedCookieLocked(uint8_t irq);
149 void publishDiagnosticLineLocked(uint8_t irq);
150 void publishAllDiagnosticLinesLocked();
152 enum FailClosedReason : uint8_t {
153 HardHandoffQuarantine = 1U << 0,
154 ThreadedPublicationQuarantine = 1U << 1,
155 UnhandledQuarantine = 1U << 2,
156 ControllerContentionQuarantine = 1U << 3,
159 void eoiLocked(uint8_t irq);
160 void applyMaskLocked();
161 void setEnabledLocked(uint8_t irq,
bool enable);
162 void enable(uint8_t irq,
bool enable);
163 void enableAll(
bool enable);
173 uint16_t m_OwnedElcr;
174 uint16_t m_OriginalElcr;
179 PciMessageInterrupts* m_Messages;
181 PciIoApicInterrupts* m_Intx;
204 bool m_ThreadedHardAdmitted[PicIrqState::LineCount];
206 bool m_ThreadedHardVetoRecovery[PicIrqState::LineCount];
207 size_t m_ThreadedHardVetoRecoveryGenerations[PicIrqState::LineCount];
212 size_t m_RemovalRejections[PicIrqState::LineCount];
217 size_t m_ControllerPromptFailures;
218 size_t m_ControllerPromptDestination;
219 size_t m_ControllerPromptState;
Abstract base class for interrupt-handlers.
size_t m_UnregisterReservations[PicIrqState::LineCount]
size_t m_ThreadedPublicationFailures[PicIrqState::LineCount]
size_t m_ThreadedDispatchGenerations[PicIrqState::LineCount]
static EXPORTED_PUBLIC Pic m_Instance
virtual bool unregisterHandler(irq_id_t Id, IrqHandlerBase *handler)
virtual bool unregisterSchedulerIrqHandler(irq_id_t Id, SchedulerIrqHandler *handler)
size_t m_HardStageGenerations[PicIrqState::LineCount]
IrqDiagnosticSnapshotStore< PicIrqState::LineCount > m_Diagnostics
virtual bool control(uint8_t irq, ControlCode code, size_t argument)
virtual irq_id_t registerIsaIrqHandler(uint8_t irq, IrqHandler *handler, const IrqPolicy &policy)
virtual irq_id_t registerHardIsaIrqHandler(uint8_t irq, HardIrqHandler *handler, const IrqPolicy &policy)
virtual irq_id_t registerPciIrqHandler(IrqHandler *handler, Device *pDevice, const IrqPolicy &policy)
Mutex m_ControllerThreadMutex
size_t m_ThreadedCookies[PicIrqState::LineCount]
PicControllerStateGate m_ControllerStateGate
uint16_t m_ControllerTemporaryMask
PicHardTailQueue m_HardTailQueue
virtual irq_id_t registerSchedulerIrqHandler(uint8_t irq, SchedulerIrqHandler *handler, const IrqPolicy &policy)
uint8_t m_FailClosedReasons[PicIrqState::LineCount]
size_t m_UnhandledIrqCount[16]
bool m_ThreadedHadHardStage[PicIrqState::LineCount]
size_t m_DeliveryProcessor
virtual void interrupt(size_t interruptNumber, InterruptState &state)
Pic & operator=(const Pic &)
size_t m_ControllerPromptAttempts
ThreadedIrqDispatcher m_ThreadedDispatcher
virtual irq_id_t registerHardPciIrqHandler(HardIrqHandler *handler, Device *pDevice, const IrqPolicy &policy)
SchedulerIrqHandler * m_SchedulerIrqHandler
bool registerPciMsixIrqHandlers(Device *device, IrqHandler *const *handlers, size_t count, irq_id_t *ids, bool &fallbackSafe, const size_t *processors=nullptr) override
uint16_t m_DeferredLineTransitions
bool initialiseThreaded()
bool reservePciRoute(uint8_t irq)
size_t m_SpuriousIrqCount[16]
irq_id_t registerHardPciMessageIrqHandler(HardIrqHandler *handler, Device *device, const IrqPolicy &intxFallbackPolicy) override
irq_id_t registerPciMessageIrqHandler(IrqHandler *handler, Device *device, const IrqPolicy &intxFallbackPolicy) override
size_t m_MitigationThreshold[16]
IrqHandlerRegistry m_Handlers
size_t m_ControllerContentions[PicIrqState::LineCount]
bool spuriousLocked(size_t irq)
virtual size_t snapshotIrqLines(IrqLineDiagnosticSnapshot *out, size_t capacity) const
bool initialise() INITIALISATION_ONLY
uint16_t m_AppliedControllerMask
#define INITIALISATION_ONLY