ReactOS 0.4.17-dev-966-gf06eace
debug.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS PCI Bus Driver
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/bus/pci/debug.c
5 * PURPOSE: Debug Helpers
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9/* INCLUDES *******************************************************************/
10
11#include <pci.h>
12
13#define NDEBUG
14#include <debug.h>
15
16/* GLOBALS ********************************************************************/
17
19{
20 "START_DEVICE",
21 "QUERY_REMOVE_DEVICE",
22 "REMOVE_DEVICE",
23 "CANCEL_REMOVE_DEVICE",
24 "STOP_DEVICE",
25 "QUERY_STOP_DEVICE",
26 "CANCEL_STOP_DEVICE",
27 "QUERY_DEVICE_RELATIONS",
28 "QUERY_INTERFACE",
29 "QUERY_CAPABILITIES",
30 "QUERY_RESOURCES",
31 "QUERY_RESOURCE_REQUIREMENTS",
32 "QUERY_DEVICE_TEXT",
33 "FILTER_RESOURCE_REQUIREMENTS",
34 "** UNKNOWN PNP IRP Minor Code **",
35 "READ_CONFIG",
36 "WRITE_CONFIG",
37 "EJECT",
38 "SET_LOCK",
39 "QUERY_ID",
40 "QUERY_PNP_DEVICE_STATE",
41 "QUERY_BUS_INFORMATION",
42 "DEVICE_USAGE_NOTIFICATION"
43};
44
46{
47 "WAIT_WAKE",
48 "POWER_SEQUENCE",
49 "SET_POWER",
50 "QUERY_POWER",
51};
52
54{
55 "Unspecified",
56 "Working",
57 "Sleeping1",
58 "Sleeping2",
59 "Sleeping3",
60 "Hibernate",
61 "Shutdown"
62};
63
65{
66 "Unspecified",
67 "D0",
68 "D1",
69 "D2",
70 "D3"
71};
72
75
76/* FUNCTIONS ******************************************************************/
77
81{
82 PCHAR Text;
83
84 /* Catch invalid code */
86 {
87 /* New version of Windows? Or driver bug */
88 Text = "** UNKNOWN PNP IRP Minor Code **";
89 }
90 else
91 {
92 /* Get the right text for it */
94 }
95
96 /* Return the symbolic name for the IRP */
97 return Text;
98}
99
100PCHAR
101NTAPI
103{
104 PCHAR Text;
105
106 /* Catch invalid code */
108 {
109 /* New version of Windows? Or driver bug */
110 Text = "** UNKNOWN PO IRP Minor Code **";
111 }
112 else
113 {
114 /* Get the right text for it */
116 }
117
118 /* Return the symbolic name for the IRP */
119 return Text;
120}
121
123NTAPI
125 IN PPCI_FDO_EXTENSION DeviceExtension,
126 IN USHORT MaxMinor)
127{
128 PPCI_PDO_EXTENSION PdoDeviceExtension;
129 ULONG BreakMask;
130 //ULONG DebugLevel = 0;
131 PCHAR IrpString;
132
133 /* Only two functions are recognized */
135 {
136 case IRP_MJ_POWER:
137
138 /* Get the string and the correct break mask for the extension */
139 BreakMask = (DeviceExtension->ExtensionType == PciPdoExtensionType) ?
142 break;
143
144 case IRP_MJ_PNP:
145
146 /* Get the string and the correct break mask for the extension */
147 BreakMask = (DeviceExtension->ExtensionType == PciFdoExtensionType) ?
150 break;
151
152 default:
153
154 /* Other functions are not decoded */
155 BreakMask = FALSE;
156 IrpString = "";
157 break;
158 }
159
160 /* Check if this is a PDO */
161 if (DeviceExtension->ExtensionType == PciPdoExtensionType)
162 {
163 /* Choose the correct debug level based on which function this is */
165 {
166 //DebugLevel = 0x500;
167 }
169 {
170 //DebugLevel = 0x200;
171 }
172
173 /* For a PDO, print out the bus, device, and function number */
174 PdoDeviceExtension = (PVOID)DeviceExtension;
175 DPRINT1("PDO(b=0x%x, d=0x%x, f=0x%x)<-%s\n",
176 PdoDeviceExtension->ParentFdoExtension->BaseBus,
177 PdoDeviceExtension->Slot.u.bits.DeviceNumber,
178 PdoDeviceExtension->Slot.u.bits.FunctionNumber,
179 IrpString);
180 }
181 else if (DeviceExtension->ExtensionType == PciFdoExtensionType)
182 {
183 /* Choose the correct debug level based on which function this is */
185 {
186 //DebugLevel = 0x400;
187 }
189 {
190 //DebugLevel = 0x100;
191 }
192
193 /* For an FDO, just dump the extension pointer and IRP string */
194 DPRINT1("FDO(%p)<-%s\n", DeviceExtension, IrpString);
195 }
196
197 /* If the function is illegal for this extension, complain */
198 if (IoStackLocation->MinorFunction > MaxMinor)
199 DPRINT1("Unknown IRP, minor = 0x%x\n", IoStackLocation->MinorFunction);
200
201 /* Return whether or not the debugger should be broken into for this IRP */
202 return ((1 << IoStackLocation->MinorFunction) & BreakMask);
203}
204
205VOID
206NTAPI
208{
209 USHORT i;
210
211 /* Loop the PCI header */
212 for (i = 0; i < PCI_COMMON_HDR_LENGTH; i += 4)
213 {
214 /* Dump each DWORD and its offset */
215 DPRINT1(" %02x - %08x\n", i, *(PULONG)((ULONG_PTR)PciData + i));
216 }
217}
218
219VOID
220NTAPI
222{
223 ULONG i;
224
225 /* Dump the capabilities */
226 DPRINT1("Capabilities\n Lock:%u, Eject:%u, Remove:%u, Dock:%u, UniqueId:%u\n",
227 DeviceCaps->LockSupported,
228 DeviceCaps->EjectSupported,
229 DeviceCaps->Removable,
230 DeviceCaps->DockDevice,
231 DeviceCaps->UniqueID);
232 DbgPrint(" SilentInstall:%u, RawOk:%u, SurpriseOk:%u\n",
233 DeviceCaps->SilentInstall,
234 DeviceCaps->RawDeviceOK,
235 DeviceCaps->SurpriseRemovalOK);
236 DbgPrint(" Address %08x, UINumber %08x, Latencies D1 %u, D2 %u, D3 %u\n",
237 DeviceCaps->Address,
238 DeviceCaps->UINumber,
239 DeviceCaps->D1Latency,
240 DeviceCaps->D2Latency,
241 DeviceCaps->D3Latency);
242
243 /* Dump and convert the wake levels */
244 DbgPrint(" System Wake: %s, Device Wake: %s\n DeviceState[PowerState] [",
245 SystemPowerStates[min(DeviceCaps->SystemWake, PowerSystemMaximum)],
246 DevicePowerStates[min(DeviceCaps->DeviceWake, PowerDeviceMaximum)]);
247
248 /* Dump and convert the power state mappings */
250 DbgPrint(" %s", DevicePowerStates[DeviceCaps->DeviceState[i]]);
251
252 /* Finish the dump */
253 DbgPrint(" ]\n");
254}
255
256PCHAR
257NTAPI
259{
260 /* What kind of resource it this? */
261 switch (Type)
262 {
263 /* Pick the correct identifier string based on the type */
264 case CmResourceTypeDeviceSpecific: return "CmResourceTypeDeviceSpecific";
265 case CmResourceTypePort: return "CmResourceTypePort";
266 case CmResourceTypeInterrupt: return "CmResourceTypeInterrupt";
267 case CmResourceTypeMemory: return "CmResourceTypeMemory";
268 case CmResourceTypeDma: return "CmResourceTypeDma";
269 case CmResourceTypeBusNumber: return "CmResourceTypeBusNumber";
270 case CmResourceTypeConfigData: return "CmResourceTypeConfigData";
271 case CmResourceTypeDevicePrivate: return "CmResourceTypeDevicePrivate";
272 case CmResourceTypePcCardConfig: return "CmResourceTypePcCardConfig";
273 case CmResourceTypeMemoryLarge: return "CmResourceTypeMemoryLarge";
274 default: return "*** INVALID RESOURCE TYPE ***";
275 }
276}
277
278VOID
279NTAPI
281{
282 ULONG i;
283 PULONG Data;
284
285 /* Print out the header */
286 DPRINT1(" IoResource Descriptor dump: Descriptor @0x%p\n", Descriptor);
287 DPRINT1(" Option = 0x%x\n", Descriptor->Option);
288 DPRINT1(" Type = %u (%s)\n", Descriptor->Type, PciDebugCmResourceTypeToText(Descriptor->Type));
289 DPRINT1(" ShareDisposition = %u\n", Descriptor->ShareDisposition);
290 DPRINT1(" Flags = 0x%04X\n", Descriptor->Flags);
291
292 /* Loop private data */
293 Data = (PULONG)&Descriptor->u.DevicePrivate;
294 for (i = 0; i < 6; i += 3)
295 {
296 /* Dump it in 32-bit triplets */
297 DPRINT1(" Data[%u] = %08x %08x %08x\n", i, Data[0], Data[1], Data[2]);
298 }
299}
300
301VOID
302NTAPI
304{
305 ULONG AlternativeLists;
307 ULONG Count;
309
310 /* Make sure there's a list */
311 if (!Requirements) return;
312
313 /* Grab the main list and the alternates as well */
314 AlternativeLists = Requirements->AlternativeLists;
315 List = Requirements->List;
316
317 /* Print out the initial header*/
318 DPRINT1(" IO_RESOURCE_REQUIREMENTS_LIST (PCI Bus Driver)\n");
319 DPRINT1(" InterfaceType %d\n", Requirements->InterfaceType);
320 DPRINT1(" BusNumber 0x%x\n", Requirements->BusNumber);
321 DPRINT1(" SlotNumber %d (0x%x), (d/f = 0x%x/0x%x)\n",
322 Requirements->SlotNumber,
323 Requirements->SlotNumber,
324 ((PCI_SLOT_NUMBER*)&Requirements->SlotNumber)->u.bits.DeviceNumber,
325 ((PCI_SLOT_NUMBER*)&Requirements->SlotNumber)->u.bits.FunctionNumber);
326 DPRINT1(" AlternativeLists %u\n", AlternativeLists);
327
328 /* Scan alternative lists */
329 while (AlternativeLists--)
330 {
331 /* Get the descriptor array, and the count of descriptors */
332 Descriptor = List->Descriptors;
333 Count = List->Count;
334
335 /* Print out each descriptor */
336 DPRINT1("\n List[%u].Count = %u\n", AlternativeLists, Count);
338
339 /* Should've reached a new list now */
341 }
342
343 /* Terminate the dump */
344 DPRINT1("\n");
345}
346
347VOID
348NTAPI
350{
351 /* Dump all the data in the partial */
352 DPRINT1(" Partial Resource Descriptor @0x%p\n", PartialResource);
353 DPRINT1(" Type = %u (%s)\n", PartialResource->Type, PciDebugCmResourceTypeToText(PartialResource->Type));
354 DPRINT1(" ShareDisposition = %u\n", PartialResource->ShareDisposition);
355 DPRINT1(" Flags = 0x%04X\n", PartialResource->Flags);
356 DPRINT1(" Data[%d] = %08x %08x %08x\n",
357 0,
358 PartialResource->u.Generic.Start.LowPart,
359 PartialResource->u.Generic.Start.HighPart,
360 PartialResource->u.Generic.Length);
361}
362
363VOID
364NTAPI
366{
367 PCM_FULL_RESOURCE_DESCRIPTOR FullDescriptor;
368 PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
369 ULONG Count, i, ListCount;
370
371 /* Make sure there's something to dump */
372 if (!PartialList) return;
373
374 /* Get the full list count */
375 ListCount = PartialList->Count;
376 FullDescriptor = PartialList->List;
377 DPRINT1(" CM_RESOURCE_LIST (PCI Bus Driver) (List Count = %u)\n", PartialList->Count);
378
379 /* Loop full list */
380 for (i = 0; i < ListCount; i++)
381 {
382 /* Loop full descriptor */
383 DPRINT1(" InterfaceType %d\n", FullDescriptor->InterfaceType);
384 DPRINT1(" BusNumber 0x%x\n", FullDescriptor->BusNumber);
385
386 /* Get partial count and loop partials */
387 Count = FullDescriptor->PartialResourceList.Count;
388 for (PartialDescriptor = FullDescriptor->PartialResourceList.PartialDescriptors;
389 Count;
390 PartialDescriptor = CmiGetNextPartialDescriptor(PartialDescriptor))
391 {
392 /* Print each partial */
393 PciDebugPrintPartialResource(PartialDescriptor);
394 Count--;
395 }
396
397 /* Go to the next full descriptor */
398 FullDescriptor = (PCM_FULL_RESOURCE_DESCRIPTOR)PartialDescriptor;
399 }
400
401 /* Done printing data */
402 DPRINT1("\n");
403}
404
405
406/* EOF */
Type
Definition: Type.h:7
unsigned char BOOLEAN
Definition: actypes.h:127
#define DPRINT1
Definition: precomp.h:8
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
FORCEINLINE PCM_PARTIAL_RESOURCE_DESCRIPTOR CmiGetNextPartialDescriptor(_In_ const CM_PARTIAL_RESOURCE_DESCRIPTOR *PartialDescriptor)
Definition: cmreslist.h:31
char * Text
Definition: combotst.c:136
#define FALSE
Definition: types.h:117
BOOLEAN NTAPI PciDebugIrpDispatchDisplay(IN PIO_STACK_LOCATION IoStackLocation, IN PPCI_FDO_EXTENSION DeviceExtension, IN USHORT MaxMinor)
Definition: debug.c:124
VOID NTAPI PciDebugPrintPartialResource(IN PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialResource)
Definition: debug.c:349
VOID NTAPI PciDebugDumpCommonConfig(IN PPCI_COMMON_HEADER PciData)
Definition: debug.c:207
PCHAR PnpCodes[]
Definition: debug.c:18
PCHAR SystemPowerStates[]
Definition: debug.c:53
ULONG PciBreakOnFdoPnpIrp
Definition: debug.c:74
PCHAR NTAPI PciDebugCmResourceTypeToText(IN UCHAR Type)
Definition: debug.c:258
VOID NTAPI PciDebugPrintIoResReqList(IN PIO_RESOURCE_REQUIREMENTS_LIST Requirements)
Definition: debug.c:303
ULONG PciBreakOnPdoPowerIrp
Definition: debug.c:73
VOID NTAPI PciDebugPrintCmResList(IN PCM_RESOURCE_LIST PartialList)
Definition: debug.c:365
PCHAR NTAPI PciDebugPnpIrpTypeToText(IN USHORT MinorFunction)
Definition: debug.c:80
PCHAR DevicePowerStates[]
Definition: debug.c:64
PCHAR PoCodes[]
Definition: debug.c:45
ULONG PciBreakOnPdoPnpIrp
Definition: debug.c:74
VOID NTAPI PciDebugPrintIoResource(IN PIO_RESOURCE_DESCRIPTOR Descriptor)
Definition: debug.c:280
PCHAR NTAPI PciDebugPoIrpTypeToText(IN USHORT MinorFunction)
Definition: debug.c:102
VOID NTAPI PciDebugDumpQueryCapabilities(IN PDEVICE_CAPABILITIES DeviceCaps)
Definition: debug.c:221
ULONG PciBreakOnFdoPowerIrp
Definition: debug.c:73
@ PciFdoExtensionType
Definition: pci.h:105
@ PciPdoExtensionType
Definition: pci.h:104
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
#define DbgPrint
Definition: hal.h:12
#define min(a, b)
Definition: monoChain.cc:55
int Count
Definition: noreturn.cpp:7
#define IRP_MN_SURPRISE_REMOVAL
Definition: ntifs_ex.h:408
@ PowerSystemMaximum
Definition: ntpoapi.h:42
@ PowerSystemWorking
Definition: ntpoapi.h:36
@ PowerDeviceMaximum
Definition: ntpoapi.h:53
unsigned short USHORT
Definition: pedump.c:61
for(i=0;i< sizeof(testsuite)/sizeof(testsuite[0]);++i) ok(call_test(testsuite[i].func)
#define CmResourceTypePcCardConfig
Definition: restypes.h:113
struct _CM_FULL_RESOURCE_DESCRIPTOR * PCM_FULL_RESOURCE_DESCRIPTOR
#define CmResourceTypeConfigData
Definition: restypes.h:111
#define CmResourceTypeMemory
Definition: restypes.h:106
#define CmResourceTypeDma
Definition: restypes.h:107
#define CmResourceTypeDevicePrivate
Definition: restypes.h:112
#define CmResourceTypeDeviceSpecific
Definition: restypes.h:108
#define CmResourceTypePort
Definition: restypes.h:104
#define CmResourceTypeBusNumber
Definition: restypes.h:109
#define CmResourceTypeInterrupt
Definition: restypes.h:105
CM_PARTIAL_RESOURCE_LIST PartialResourceList
Definition: restypes.h:145
INTERFACE_TYPE InterfaceType
Definition: restypes.h:143
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]
Definition: restypes.h:100
BOOLEAN BaseBus
Definition: pci.h:221
PCI_SLOT_NUMBER Slot
Definition: pci.h:283
PPCI_FDO_EXTENSION ParentFdoExtension
Definition: pci.h:285
union _PCI_SLOT_NUMBER::@4969 u
struct _PCI_SLOT_NUMBER::@4969::@4970 bits
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char UCHAR
Definition: typedefs.h:53
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
_In_ PIO_STACK_LOCATION IoStackLocation
Definition: usbdlib.h:265
_In_ UCHAR _In_ UCHAR MinorFunction
Definition: wdfdevice.h:1705
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
#define CmResourceTypeMemoryLarge
Definition: cmtypes.h:231
struct _IO_RESOURCE_LIST * PIO_RESOURCE_LIST
#define PCI_COMMON_HDR_LENGTH
Definition: iotypes.h:3596
* PDEVICE_CAPABILITIES
Definition: iotypes.h:965
#define IRP_MJ_POWER
#define IRP_MN_QUERY_POWER