mirror of
https://github.com/EnderIce2/Fennix.git
synced 2025-05-28 15:34:31 +00:00
fix(kernel/pci): fix MapPCIAddresses when BAR size of zero
Signed-off-by: EnderIce2 <enderice2@protonmail.com>
This commit is contained in:
parent
851a8c140f
commit
f31d11f7ad
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user