From 3c3e64e133b13eacc7a8d0c9dc69bd716f11574a Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Mon, 17 Feb 2020 19:17:52 +0100 Subject: [PATCH] Enumerating PCI bus according to the actual MCFG size and not maximum --- kaleid/kernel/io/pci.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kaleid/kernel/io/pci.c b/kaleid/kernel/io/pci.c index 2a5b1e8..edec506 100644 --- a/kaleid/kernel/io/pci.c +++ b/kaleid/kernel/io/pci.c @@ -27,6 +27,7 @@ #include static void *pciConfigBaseAddress = NULL; +static MCFG_t *MCFG_table = NULL; // -------------------------------------------------------------------------- // @@ -114,6 +115,7 @@ void IoPciEnumerate() for(uchar device = 0; device < 32; device++) { for(uchar function = 0; function < 8; function++) { ushort vendor = pciReadConfigWord((uchar)bus, device, function, PCI_REG_VENDOR); + if(bus * device * function > MCFG_table->length) break; if(vendor == 0xffff) continue; DebugLog("PCI device class: %x, subclass: %x, vendor: %x, device: %x\n", pciReadConfigByte((uchar)bus, device, function, PCI_REG_CLASS), @@ -138,6 +140,7 @@ PciDev_t *IoPciGetDevice(ushort vendorID, ushort deviceID) for(uchar function = 0; function < 8; function++) { if(vendorID == pciReadConfigWord((uchar)bus, device, function, PCI_REG_VENDOR) && deviceID == pciReadConfigWord((uchar)bus, device, function, PCI_REG_DEVICE)) { + if(bus * device * function > MCFG_table->length) break; PciDev_t *pciDevicePtr = (PciDev_t *)malloc(sizeof(PciDev_t)); pciDevicePtr->vendorID = vendorID; pciDevicePtr->deviceID = deviceID; @@ -180,7 +183,7 @@ PciDev_t *IoPciGetDeviceByClass(uchar classID, uchar subclassID) void IoInitPCI() { - MCFG_t *MCFG_table = (MCFG_t*)IoGetAcpiTable(SDT_MCFG); + MCFG_table = (MCFG_t*)IoGetAcpiTable(SDT_MCFG); if(MCFG_table == NULL) { KeStartPanic("Unable to access PCI configuration : MCFG table not reachable\n"); }