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 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 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 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