1 /*
2 * PROJECT: ReactOS PCI Bus Driver
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/bus/pci/pcivrify.c
5 * PURPOSE: PCI Driver Verifier Support
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
18 BOOLEAN PciVerifierRegistered;
19 PVOID PciVerifierNotificationHandle;
20
21 PCI_VERIFIER_DATA PciVerifierFailureTable[PCI_VERIFIER_CODES] =
22 {
23 {
24 1,
25 VFFAILURE_FAIL_LOGO,
26 0,
27 "The BIOS has reprogrammed the bus numbers of an active PCI device "
28 "(!devstack %DevObj) during a dock or undock!"
29 },
30 {
31 2,
32 VFFAILURE_FAIL_LOGO,
33 0,
34 "A device in the system did not update it's PMCSR register in the spec "
35 "mandated time (!devstack %DevObj, Power state D%Ulong)"
36 },
37 {
38 3,
39 VFFAILURE_FAIL_LOGO,
40 0,
41 "A driver controlling a PCI device has tried to access OS controlled "
42 "configuration space registers (!devstack %DevObj, Offset 0x%Ulong1, "
43 "Length 0x%Ulong2)"
44 },
45 {
46 4,
47 VFFAILURE_FAIL_UNDER_DEBUGGER,
48 0,
49 "A driver controlling a PCI device has tried to read or write from an "
50 "invalid space using IRP_MN_READ/WRITE_CONFIG or via BUS_INTERFACE_STANDARD."
51 " NB: These functions take WhichSpace parameters of the form PCI_WHICHSPACE_*"
52 " and not a BUS_DATA_TYPE (!devstack %DevObj, WhichSpace 0x%Ulong1)"
53 },
54 };
55
56 /* FUNCTIONS ******************************************************************/
57
58 PPCI_VERIFIER_DATA
59 NTAPI
PciVerifierRetrieveFailureData(IN ULONG FailureCode)60 PciVerifierRetrieveFailureData(IN ULONG FailureCode)
61 {
62 PPCI_VERIFIER_DATA VerifierData;
63
64 /* Scan the verifier failure table for this code */
65 VerifierData = PciVerifierFailureTable;
66 while (VerifierData->FailureCode != FailureCode)
67 {
68 /* Keep searching */
69 ++VerifierData;
70 ASSERT(VerifierData < &PciVerifierFailureTable[PCI_VERIFIER_CODES]);
71 }
72
73 /* Return the entry for this code */
74 return VerifierData;
75 }
76
77 DRIVER_NOTIFICATION_CALLBACK_ROUTINE PciVerifierProfileChangeCallback;
78
79 NTSTATUS
80 NTAPI
PciVerifierProfileChangeCallback(IN PVOID NotificationStructure,IN PVOID Context)81 PciVerifierProfileChangeCallback(IN PVOID NotificationStructure,
82 IN PVOID Context)
83 {
84 UNREFERENCED_PARAMETER(NotificationStructure);
85 UNREFERENCED_PARAMETER(Context);
86
87 /* This function is not yet implemented */
88 UNIMPLEMENTED_DBGBREAK();
89 return STATUS_SUCCESS;
90 }
91
92 VOID
93 NTAPI
PciVerifierInit(IN PDRIVER_OBJECT DriverObject)94 PciVerifierInit(IN PDRIVER_OBJECT DriverObject)
95 {
96 NTSTATUS Status;
97
98 /* Check if the kernel driver verifier is enabled */
99 if (VfIsVerificationEnabled(VFOBJTYPE_SYSTEM_BIOS, NULL))
100 {
101 /* Register a notification for changes, to keep track of the PCI tree */
102 Status = IoRegisterPlugPlayNotification(EventCategoryHardwareProfileChange,
103 0,
104 NULL,
105 DriverObject,
106 PciVerifierProfileChangeCallback,
107 NULL,
108 &PciVerifierNotificationHandle);
109 if (NT_SUCCESS(Status)) PciVerifierRegistered = TRUE;
110 }
111 }
112
113 /* EOF */
114