fix(kernel/pci): fix MapPCIAddresses when BAR size of zero

Signed-off-by: EnderIce2 <enderice2@protonmail.com>
This commit is contained in:
EnderIce2 2025-03-02 21:28:28 +00:00
parent 851a8c140f
commit f31d11f7ad
No known key found for this signature in database
GPG Key ID: 2EE20AF089811A5A

View File

@ -887,8 +887,8 @@ namespace PCI
{ {
PCIHeader0 *hdr0 = (PCIHeader0 *)Device.Header; PCIHeader0 *hdr0 = (PCIHeader0 *)Device.Header;
uint32_t BAR[6]; uint32_t BAR[6] = {};
size_t BARsSize[6]; size_t BARsSize[6] = {};
BAR[0] = hdr0->BAR0; BAR[0] = hdr0->BAR0;
BAR[1] = hdr0->BAR1; BAR[1] = hdr0->BAR1;
@ -909,26 +909,46 @@ namespace PCI
size_t size; size_t size;
if ((BAR[i] & 1) == 0) /* Memory Base */ if ((BAR[i] & 1) == 0) /* Memory Base */
{ {
hdr0->BAR0 = 0xFFFFFFFF; hdr0->BAR0 = UINT32_MAX;
size = hdr0->BAR0; size = hdr0->BAR0;
hdr0->BAR0 = BAR[i]; hdr0->BAR0 = BAR[i];
BARsSize[i] = size & (~15);
BARsSize[i] = ~BARsSize[i] + 1; /* FIXME: further testing required */
BARsSize[i] = BARsSize[i] & 0xFFFFFFFF; // if ((BAR[i] & 0x6) == 0x4) /* 64-bit address */
debug("BAR%d %#lx size: %d", // {
i, BAR[i], BARsSize[i]); // hdr0->BAR1 = UINT32_MAX;
// size |= ((size_t)hdr0->BAR1 << 32);
// hdr0->BAR1 = BAR[i + 1];
// i++; /* Skip the next BAR since it's part of the 64-bit address */
// }
size = size & (~15);
size = ~size + 1;
size = size & UINT32_MAX;
if (size == 0)
{
warn("BAR%d size is zero! Device: %#x:%#x", i, Device.Header->VendorID, Device.Header->DeviceID);
size++;
}
BARsSize[i] = size;
} }
else if ((BAR[i] & 1) == 1) /* I/O Base */ else if ((BAR[i] & 1) == 1) /* I/O Base */
{ {
hdr0->BAR1 = 0xFFFFFFFF; hdr0->BAR1 = UINT32_MAX;
size = hdr0->BAR1; size = hdr0->BAR1;
hdr0->BAR1 = BAR[i]; hdr0->BAR1 = BAR[i];
BARsSize[i] = size & (~3);
BARsSize[i] = ~BARsSize[i] + 1; size = size & (~3);
BARsSize[i] = BARsSize[i] & 0xFFFF; size = ~size + 1;
debug("BAR%d %#lx size: %d", size = size & UINT16_MAX;
i, BAR[i], BARsSize[i]); if (size == 0)
{
warn("BAR%d size is zero! Device: %#x:%#x", i, Device.Header->VendorID, Device.Header->DeviceID);
size++;
}
BARsSize[i] = size;
} }
debug("BAR%d %#lx size: %zu", i, BAR[i], BARsSize[i]);
} }
/* Mapping the BARs */ /* Mapping the BARs */
@ -942,24 +962,20 @@ namespace PCI
uintptr_t BARBase = BAR[i] & (~15); uintptr_t BARBase = BAR[i] & (~15);
size_t BARSize = BARsSize[i]; size_t BARSize = BARsSize[i];
debug("Mapping BAR%d %#lx-%#lx", debug("Mapping BAR%d %#lx-%#lx", i, BARBase, BARBase + BARSize);
i, BARBase, BARBase + BARSize);
if (BARSize > 0) Memory::Virtual(Table).Map((void *)BARBase, (void *)BARBase,
Memory::Virtual(Table).Map((void *)BARBase, (void *)BARBase, BARSize, Memory::RW | Memory::PWT | Memory::PCD);
BARSize, Memory::RW | Memory::PWT | Memory::PCD);
} }
else if ((BAR[i] & 1) == 1) /* I/O Base */ else if ((BAR[i] & 1) == 1) /* I/O Base */
{ {
uintptr_t BARBase = BAR[i] & (~3); uintptr_t BARBase = BAR[i] & (~3);
size_t BARSize = BARsSize[i]; size_t BARSize = BARsSize[i];
debug("Mapping BAR%d %#x-%#x", debug("Mapping BAR%d %#x-%#x", i, BARBase, BARBase + BARSize);
i, BARBase, BARBase + BARSize);
if (BARSize > 0) Memory::Virtual(Table).Map((void *)BARBase, (void *)BARBase,
Memory::Virtual(Table).Map((void *)BARBase, (void *)BARBase, BARSize, Memory::RW | Memory::PWT | Memory::PCD);
BARSize, Memory::RW | Memory::PWT | Memory::PCD);
} }
} }
break; break;