ReactOS 0.4.15-dev-6661-gcc6e444
irq.c File Reference
#include <ntoskrnl.h>
#include <debug.h>
Include dependency graph for irq.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

NTSTATUS NTAPI IoConnectInterrupt (OUT PKINTERRUPT *InterruptObject, IN PKSERVICE_ROUTINE ServiceRoutine, IN PVOID ServiceContext, IN PKSPIN_LOCK SpinLock, IN ULONG Vector, IN KIRQL Irql, IN KIRQL SynchronizeIrql, IN KINTERRUPT_MODE InterruptMode, IN BOOLEAN ShareVector, IN KAFFINITY ProcessorEnableMask, IN BOOLEAN FloatingSave)
 
VOID NTAPI IoDisconnectInterrupt (PKINTERRUPT InterruptObject)
 
NTSTATUS IopConnectInterruptExFullySpecific (_Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS Parameters)
 
NTSTATUS NTAPI IoConnectInterruptEx (_Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS Parameters)
 
VOID NTAPI IoDisconnectInterruptEx (_In_ PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file irq.c.

Function Documentation

◆ IoConnectInterrupt()

NTSTATUS NTAPI IoConnectInterrupt ( OUT PKINTERRUPT InterruptObject,
IN PKSERVICE_ROUTINE  ServiceRoutine,
IN PVOID  ServiceContext,
IN PKSPIN_LOCK  SpinLock,
IN ULONG  Vector,
IN KIRQL  Irql,
IN KIRQL  SynchronizeIrql,
IN KINTERRUPT_MODE  InterruptMode,
IN BOOLEAN  ShareVector,
IN KAFFINITY  ProcessorEnableMask,
IN BOOLEAN  FloatingSave 
)

Definition at line 22 of file irq.c.

33{
35 PKINTERRUPT InterruptUsed;
36 PIO_INTERRUPT IoInterrupt;
37 PKSPIN_LOCK SpinLockUsed;
38 BOOLEAN FirstRun;
39 CCHAR Count = 0;
41 PAGED_CODE();
42
43 /* Assume failure */
45
46 /* Get the affinity */
48 while (Affinity)
49 {
50 /* Increase count */
51 if (Affinity & 1) Count++;
52 Affinity >>= 1;
53 }
54
55 /* Make sure we have a valid CPU count */
57
58 /* Allocate the array of I/O Interrupts */
60 (Count - 1) * sizeof(KINTERRUPT) +
61 sizeof(IO_INTERRUPT),
63 if (!IoInterrupt) return STATUS_INSUFFICIENT_RESOURCES;
64
65 /* Select which Spinlock to use */
66 SpinLockUsed = SpinLock ? SpinLock : &IoInterrupt->SpinLock;
67
68 /* We first start with a built-in Interrupt inside the I/O Structure */
69 *InterruptObject = &IoInterrupt->FirstInterrupt;
70 Interrupt = (PKINTERRUPT)(IoInterrupt + 1);
71 FirstRun = TRUE;
72
73 /* Start with a fresh structure */
74 RtlZeroMemory(IoInterrupt, sizeof(IO_INTERRUPT));
75
76 /* Now create all the interrupts */
78 for (Count = 0; Affinity; Count++, Affinity >>= 1)
79 {
80 /* Check if it's enabled for this CPU */
81 if (Affinity & 1)
82 {
83 /* Check which one we will use */
84 InterruptUsed = FirstRun ? &IoInterrupt->FirstInterrupt : Interrupt;
85
86 /* Initialize it */
87 KeInitializeInterrupt(InterruptUsed,
90 SpinLockUsed,
91 Vector,
92 Irql,
96 Count,
98
99 /* Connect it */
100 if (!KeConnectInterrupt(InterruptUsed))
101 {
102 /* Check how far we got */
103 if (FirstRun)
104 {
105 /* We failed early so just free this */
106 ExFreePoolWithTag(IoInterrupt, TAG_KINTERRUPT);
107 }
108 else
109 {
110 /* Far enough, so disconnect everything */
112 }
113
114 /* And fail */
116 }
117
118 /* Now we've used up our First Run */
119 if (FirstRun)
120 {
121 FirstRun = FALSE;
122 }
123 else
124 {
125 /* Move on to the next one */
126 IoInterrupt->Interrupt[(UCHAR)Count] = Interrupt++;
127 }
128 }
129 }
130
131 /* Return Success */
132 return STATUS_SUCCESS;
133}
#define PAGED_CODE()
unsigned char BOOLEAN
_Out_ PKIRQL Irql
Definition: csq.h:179
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
ULONG_PTR KAFFINITY
Definition: compat.h:85
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
KSPIN_LOCK * PKSPIN_LOCK
Definition: env_spec_w32.h:73
#define NonPagedPool
Definition: env_spec_w32.h:307
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
@ InterruptObject
Definition: ketypes.h:461
int Count
Definition: noreturn.cpp:7
struct _KINTERRUPT * PKINTERRUPT
Definition: nt_native.h:32
KAFFINITY KeActiveProcessors
Definition: krnlinit.c:23
VOID NTAPI IoDisconnectInterrupt(PKINTERRUPT InterruptObject)
Definition: irq.c:140
BOOLEAN NTAPI KeConnectInterrupt(IN PKINTERRUPT Interrupt)
Definition: interrupt.c:81
VOID NTAPI KeInitializeInterrupt(IN PKINTERRUPT Interrupt, IN PKSERVICE_ROUTINE ServiceRoutine, IN PVOID ServiceContext, IN PKSPIN_LOCK SpinLock, IN ULONG Vector, IN KIRQL Irql, IN KIRQL SynchronizeIrql, IN KINTERRUPT_MODE InterruptMode, IN BOOLEAN ShareVector, IN CHAR ProcessorNumber, IN BOOLEAN FloatingSave)
Definition: interrupt.c:29
#define STATUS_SUCCESS
Definition: shellext.h:65
KSPIN_LOCK SpinLock
Definition: io.h:325
PKINTERRUPT Interrupt[MAXIMUM_PROCESSORS]
Definition: io.h:324
KINTERRUPT FirstInterrupt
Definition: io.h:323
#define TAG_KINTERRUPT
Definition: tag.h:88
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
char CCHAR
Definition: typedefs.h:51
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
Definition: wdfinterrupt.h:379
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFSPINLOCK * SpinLock
Definition: wdfsync.h:228
_In_ ULONG _In_ ULONG _In_ ULONG _Out_ PKIRQL _Out_ PKAFFINITY Affinity
Definition: halfuncs.h:174
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID _In_opt_ PKSPIN_LOCK _In_ ULONG _In_ KIRQL _In_ KIRQL _In_ KINTERRUPT_MODE _In_ BOOLEAN _In_ KAFFINITY ProcessorEnableMask
Definition: iofuncs.h:808
_In_ PKSERVICE_ROUTINE ServiceRoutine
Definition: iofuncs.h:800
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID _In_opt_ PKSPIN_LOCK _In_ ULONG _In_ KIRQL _In_ KIRQL _In_ KINTERRUPT_MODE InterruptMode
Definition: iofuncs.h:806
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID _In_opt_ PKSPIN_LOCK _In_ ULONG _In_ KIRQL _In_ KIRQL SynchronizeIrql
Definition: iofuncs.h:805
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID _In_opt_ PKSPIN_LOCK _In_ ULONG _In_ KIRQL _In_ KIRQL _In_ KINTERRUPT_MODE _In_ BOOLEAN _In_ KAFFINITY _In_ BOOLEAN FloatingSave
Definition: iofuncs.h:809
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID _In_opt_ PKSPIN_LOCK _In_ ULONG _In_ KIRQL _In_ KIRQL _In_ KINTERRUPT_MODE _In_ BOOLEAN ShareVector
Definition: iofuncs.h:807
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID ServiceContext
Definition: iofuncs.h:801
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by AcpiOsInstallInterruptHandler(), AddControllers(), EnableIrq(), FdoCallHWInitialize(), HDA_FDOStartDevice(), i8042ConnectKeyboardInterrupt(), i8042ConnectMouseInterrupt(), InPortStartDevice(), IntVideoPortSetupInterrupt(), IopConnectInterruptExFullySpecific(), LegacyAttachInterrupt(), NdisMRegisterInterrupt(), PortFdoConnectInterrupt(), sb16_play(), SerialPnpStartDevice(), StreamClassStartDevice(), UniataConnectIntr2(), and USBPORT_StartDevice().

◆ IoConnectInterruptEx()

NTSTATUS NTAPI IoConnectInterruptEx ( _Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS  Parameters)

Definition at line 194 of file irq.c.

196{
197 PAGED_CODE();
198 switch (Parameters->Version)
199 {
203 //TODO: We don't do anything for the group type
206 DPRINT1("FIXME: Message based interrupts are UNIMPLEMENTED\n");
207 break;
209 DPRINT1("FIXME: Line based interrupts are UNIMPLEMENTED\n");
210 break;
211 }
212 return STATUS_SUCCESS;
213}
#define DPRINT1
Definition: precomp.h:8
NTSTATUS IopConnectInterruptExFullySpecific(_Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS Parameters)
Definition: irq.c:170
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
Definition: wdfio.h:869
#define CONNECT_FULLY_SPECIFIED_GROUP
#define CONNECT_LINE_BASED
#define CONNECT_FULLY_SPECIFIED
#define CONNECT_MESSAGE_BASED

◆ IoDisconnectInterrupt()

VOID NTAPI IoDisconnectInterrupt ( PKINTERRUPT  InterruptObject)

Definition at line 140 of file irq.c.

141{
142 LONG i;
143 PIO_INTERRUPT IoInterrupt;
144 PAGED_CODE();
145
146 /* Get the I/O Interrupt */
149 FirstInterrupt);
150
151 /* Disconnect the first one */
153
154 /* Now disconnect the others */
155 for (i = 0; i < KeNumberProcessors; i++)
156 {
157 /* Make sure one was registered */
158 if (IoInterrupt->Interrupt[i])
159 {
160 /* Disconnect it */
162 }
163 }
164
165 /* Free the I/O Interrupt */
166 ExFreePool(IoInterrupt); // ExFreePoolWithTag(IoInterrupt, TAG_KINTERRUPT);
167}
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
CCHAR KeNumberProcessors
Definition: krnlinit.c:35
BOOLEAN NTAPI KeDisconnectInterrupt(IN PKINTERRUPT Interrupt)
Definition: interrupt.c:159
long LONG
Definition: pedump.c:60
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by AcpiOsRemoveInterruptHandler(), AddControllers(), FdoRemoveAdapter(), HDA_FDORemoveDevice(), i8042ConnectMouseInterrupt(), InPortRemoveDevice(), IntVideoPortFindAdapter(), IoConnectInterrupt(), IoDisconnectInterruptEx(), NdisMDeregisterInterrupt(), StreamClassReleaseResources(), UniataDisconnectIntr2(), Unload(), and USBPORT_StartDevice().

◆ IoDisconnectInterruptEx()

VOID NTAPI IoDisconnectInterruptEx ( _In_ PIO_DISCONNECT_INTERRUPT_PARAMETERS  Parameters)

Definition at line 217 of file irq.c.

219{
220 PAGED_CODE();
221
222 //FIXME: This eventually will need to handle more cases
223 if (Parameters->ConnectionContext.InterruptObject)
224 IoDisconnectInterrupt(Parameters->ConnectionContext.InterruptObject);
225}

◆ IopConnectInterruptExFullySpecific()

NTSTATUS IopConnectInterruptExFullySpecific ( _Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS  Parameters)

Definition at line 170 of file irq.c.

172{
174 PAGED_CODE();
175
176 /* Fallback to standard IoConnectInterrupt */
177 Status = IoConnectInterrupt(Parameters->FullySpecified.InterruptObject,
178 Parameters->FullySpecified.ServiceRoutine,
179 Parameters->FullySpecified.ServiceContext,
180 Parameters->FullySpecified.SpinLock,
181 Parameters->FullySpecified.Vector,
182 Parameters->FullySpecified.Irql,
183 Parameters->FullySpecified.SynchronizeIrql,
184 Parameters->FullySpecified.InterruptMode,
185 Parameters->FullySpecified.ShareVector,
186 Parameters->FullySpecified.ProcessorEnableMask,
187 Parameters->FullySpecified.FloatingSave);
188 DPRINT("IopConnectInterruptEx_FullySpecific: has failed with status %X", Status);
189 return Status;
190}
LONG NTSTATUS
Definition: precomp.h:26
Status
Definition: gdiplustypes.h:25
NTSTATUS NTAPI IoConnectInterrupt(OUT PKINTERRUPT *InterruptObject, IN PKSERVICE_ROUTINE ServiceRoutine, IN PVOID ServiceContext, IN PKSPIN_LOCK SpinLock, IN ULONG Vector, IN KIRQL Irql, IN KIRQL SynchronizeIrql, IN KINTERRUPT_MODE InterruptMode, IN BOOLEAN ShareVector, IN KAFFINITY ProcessorEnableMask, IN BOOLEAN FloatingSave)
Definition: irq.c:22
#define DPRINT
Definition: sndvol32.h:71

Referenced by IoConnectInterruptEx().