Properly handle BARs bigger than 4G. The '1' was treated as an int
causing the size calculation to be truncated to the size of an int (32-bits on all current architectures). Submitted by: Anish akgupt3 of gmail MFC after: 1 week
This commit is contained in:
parent
902a44bea0
commit
53ab29d183
@ -2549,13 +2549,13 @@ pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl,
|
||||
return (barlen);
|
||||
}
|
||||
|
||||
count = 1 << mapsize;
|
||||
count = (pci_addr_t)1 << mapsize;
|
||||
if (basezero || base == pci_mapbase(testval)) {
|
||||
start = 0; /* Let the parent decide. */
|
||||
end = ~0ULL;
|
||||
} else {
|
||||
start = base;
|
||||
end = base + (1 << mapsize) - 1;
|
||||
end = base + count - 1;
|
||||
}
|
||||
resource_list_add(rl, type, reg, start, end, count);
|
||||
|
||||
@ -3764,7 +3764,7 @@ pci_reserve_map(device_t dev, device_t child, int type, int *rid,
|
||||
* situation where we might allocate the excess to
|
||||
* another driver, which won't work.
|
||||
*/
|
||||
count = 1UL << mapsize;
|
||||
count = (pci_addr_t)1 << mapsize;
|
||||
if (RF_ALIGNMENT(flags) < mapsize)
|
||||
flags = (flags & ~RF_ALIGNMENT_MASK) | RF_ALIGNMENT_LOG2(mapsize);
|
||||
if (PCI_BAR_MEM(testval) && (testval & PCIM_BAR_MEM_PREFETCH))
|
||||
|
Loading…
Reference in New Issue
Block a user