The Pedigree Project 0.1
Pic.h
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
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"
35
36#include <config.h>
37
38#include "PicIrqState.h"
39
40class Device;
41class HardIrqHandler;
42class IrqHandler;
43class IrqHandlerBase;
45
50class Pic : public IrqManager, private InterruptHandler {
51 public:
54 inline static Pic& instance() {
55 return m_Instance;
56 }
57
59 bool reservePciRoute(uint8_t irq);
60
61 //
62 // IrqManager interface
63 //
64 virtual irq_id_t registerIsaIrqHandler(uint8_t irq, IrqHandler* handler, const IrqPolicy& policy);
65 virtual irq_id_t registerPciIrqHandler(IrqHandler* handler, Device* pDevice,
66 const IrqPolicy& policy);
67 virtual irq_id_t registerHardIsaIrqHandler(uint8_t irq, HardIrqHandler* handler,
68 const IrqPolicy& policy);
69 virtual irq_id_t registerHardPciIrqHandler(HardIrqHandler* handler, Device* pDevice,
70 const IrqPolicy& policy);
71 virtual irq_id_t registerSchedulerIrqHandler(uint8_t irq, SchedulerIrqHandler* handler,
72 const IrqPolicy& policy);
73 virtual bool unregisterSchedulerIrqHandler(irq_id_t Id, SchedulerIrqHandler* handler);
74 virtual bool unregisterHandler(irq_id_t Id, IrqHandlerBase* handler);
75 virtual size_t snapshotIrqLines(IrqLineDiagnosticSnapshot* out, size_t capacity) const;
76
81
83 bool initialiseThreaded();
84
86 bool shutdownThreaded();
87
89 virtual void tick();
90
92 virtual bool control(uint8_t irq, ControlCode code, size_t argument);
93
94 private:
95 class StateGuard;
96 class HardStateGuard;
97
101 inline virtual ~Pic() {}
104 Pic(const Pic&);
107 Pic& operator=(const Pic&);
108
109 //
110 // InterruptHandler interface
111 //
112 virtual void interrupt(size_t interruptNumber, InterruptState& state);
113
114 static void dispatchThreadedLine(void* context, uint8_t irq, size_t cookie);
115#if APIC
116 static bool promptThreadedWorker(void* context, uint8_t line, size_t workerProcessor);
117#endif
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);
134 void finishHardDispatchLocked(const PicHardTailRecord& record);
135 void finishHardDispatchFromInterrupt(const PicHardTailRecord& record);
136 size_t advanceThreadedCookieLocked(uint8_t irq);
137 void publishDiagnosticLineLocked(uint8_t irq);
138 void publishAllDiagnosticLinesLocked();
139
140 enum FailClosedReason : uint8_t {
141 HardHandoffQuarantine = 1U << 0,
142 ThreadedPublicationQuarantine = 1U << 1,
143 UnhandledQuarantine = 1U << 2,
144 ControllerContentionQuarantine = 1U << 3,
145 };
146
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);
152
154 bool spuriousLocked(size_t irq);
155
160 IoPort m_ElcrPort;
161 uint16_t m_OwnedElcr;
162 uint16_t m_OriginalElcr;
163
179 size_t m_ThreadedCookies[PicIrqState::LineCount];
181 size_t m_ThreadedDispatchGenerations[PicIrqState::LineCount];
183 size_t m_HardStageGenerations[PicIrqState::LineCount];
185 bool m_ThreadedHadHardStage[PicIrqState::LineCount];
186 bool m_ThreadedHardAdmitted[PicIrqState::LineCount];
187 HardIrqDisposition m_ThreadedHardDisposition[PicIrqState::LineCount];
188 bool m_ThreadedHardVetoRecovery[PicIrqState::LineCount];
189 size_t m_ThreadedHardVetoRecoveryGenerations[PicIrqState::LineCount];
191 uint8_t m_FailClosedReasons[PicIrqState::LineCount];
193 size_t m_ThreadedPublicationFailures[PicIrqState::LineCount];
194 size_t m_RemovalRejections[PicIrqState::LineCount];
196 size_t m_ControllerContentions[PicIrqState::LineCount];
199 size_t m_ControllerPromptFailures;
200 size_t m_ControllerPromptDestination;
201 size_t m_ControllerPromptState;
215 size_t m_UnregisterReservations[PicIrqState::LineCount];
219 size_t m_IrqCount[16];
230};
231
234#endif
Abstract base class for interrupt-handlers.
I/O port range.
Definition IoPort.h:33
Definition Mutex.h:56
Definition Pic.h:50
size_t m_UnregisterReservations[PicIrqState::LineCount]
Definition Pic.h:215
size_t m_ThreadedPublicationFailures[PicIrqState::LineCount]
Definition Pic.h:193
size_t m_ThreadedDispatchGenerations[PicIrqState::LineCount]
Definition Pic.h:181
static Pic m_Instance
Definition Pic.h:229
virtual bool unregisterHandler(irq_id_t Id, IrqHandlerBase *handler)
Definition Pic.cc:469
virtual bool unregisterSchedulerIrqHandler(irq_id_t Id, SchedulerIrqHandler *handler)
Definition Pic.cc:384
size_t m_HardStageGenerations[PicIrqState::LineCount]
Definition Pic.h:183
IrqDiagnosticSnapshotStore< PicIrqState::LineCount > m_Diagnostics
Definition Pic.h:213
static Pic & instance()
Definition Pic.h:54
uint8_t m_DeliveryApicId
Definition Pic.h:211
virtual bool control(uint8_t irq, ControlCode code, size_t argument)
Definition Pic.cc:138
virtual irq_id_t registerIsaIrqHandler(uint8_t irq, IrqHandler *handler, const IrqPolicy &policy)
Definition Pic.cc:161
virtual irq_id_t registerHardIsaIrqHandler(uint8_t irq, HardIrqHandler *handler, const IrqPolicy &policy)
Definition Pic.cc:194
virtual irq_id_t registerPciIrqHandler(IrqHandler *handler, Device *pDevice, const IrqPolicy &policy)
Definition Pic.cc:280
Mutex m_ControllerThreadMutex
Definition Pic.h:175
size_t m_ThreadedCookies[PicIrqState::LineCount]
Definition Pic.h:179
PicControllerStateGate m_ControllerStateGate
Definition Pic.h:171
IoPort m_MasterPort
Definition Pic.h:159
uint16_t m_ControllerTemporaryMask
Definition Pic.h:203
PicHardTailQueue m_HardTailQueue
Definition Pic.h:173
Pic(const Pic &)
virtual irq_id_t registerSchedulerIrqHandler(uint8_t irq, SchedulerIrqHandler *handler, const IrqPolicy &policy)
Definition Pic.cc:366
uint8_t m_FailClosedReasons[PicIrqState::LineCount]
Definition Pic.h:191
size_t m_UnhandledIrqCount[16]
Definition Pic.h:223
virtual void tick()
Definition Pic.cc:136
bool m_ThreadedHadHardStage[PicIrqState::LineCount]
Definition Pic.h:185
size_t m_DeliveryProcessor
Definition Pic.h:209
virtual void interrupt(size_t interruptNumber, InterruptState &state)
Definition Pic.cc:1185
Pic & operator=(const Pic &)
bool m_ShuttingDown
Definition Pic.h:217
size_t m_ControllerPromptAttempts
Definition Pic.h:198
IoPort m_SlavePort
Definition Pic.h:157
ThreadedIrqDispatcher m_ThreadedDispatcher
Definition Pic.h:177
virtual irq_id_t registerHardPciIrqHandler(HardIrqHandler *handler, Device *pDevice, const IrqPolicy &policy)
Definition Pic.cc:323
SchedulerIrqHandler * m_SchedulerIrqHandler
Definition Pic.h:167
uint16_t m_DeferredLineTransitions
Definition Pic.h:207
bool initialiseThreaded()
Definition Pic.cc:562
bool reservePciRoute(uint8_t irq)
Definition Pic.cc:226
size_t m_SpuriousIrqCount[16]
Definition Pic.h:221
bool m_MitigatedIrqs[16]
Definition Pic.h:225
size_t m_MitigationThreshold[16]
Definition Pic.h:227
IrqHandlerRegistry m_Handlers
Definition Pic.h:165
bool shutdownThreaded()
Definition Pic.cc:586
PicIrqState m_IrqState
Definition Pic.h:169
size_t m_ControllerContentions[PicIrqState::LineCount]
Definition Pic.h:196
bool spuriousLocked(size_t irq)
Definition Pic.cc:838
virtual size_t snapshotIrqLines(IrqLineDiagnosticSnapshot *out, size_t capacity) const
Definition Pic.cc:746
bool initialise() INITIALISATION_ONLY
Definition Pic.cc:515
uint16_t m_AppliedControllerMask
Definition Pic.h:205
size_t m_IrqCount[16]
Definition Pic.h:219
HardIrqDisposition
Definition IrqHandler.h:44