xref: /reactos/drivers/bus/pcix/pcivrify.c (revision c2c66aff)
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