pci: fix up w64 size calculation helper
BAR base was calculated incorrectly. Use existing pci_bar_address to get it right. Tested-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
							parent
							
								
									e732ea6387
								
							
						
					
					
						commit
						77d6f4ea76
					
				
							
								
								
									
										20
									
								
								hw/pci/pci.c
								
								
								
								
							
							
						
						
									
										20
									
								
								hw/pci/pci.c
								
								
								
								
							| 
						 | 
				
			
			@ -2306,7 +2306,7 @@ static void pci_dev_get_w64(PCIBus *b, PCIDevice *dev, void *opaque)
 | 
			
		|||
    Range *range = opaque;
 | 
			
		||||
    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
 | 
			
		||||
    uint16_t cmd = pci_get_word(dev->config + PCI_COMMAND);
 | 
			
		||||
    int r;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    if (!(cmd & PCI_COMMAND_MEMORY)) {
 | 
			
		||||
        return;
 | 
			
		||||
| 
						 | 
				
			
			@ -2325,17 +2325,21 @@ static void pci_dev_get_w64(PCIBus *b, PCIDevice *dev, void *opaque)
 | 
			
		|||
            range_extend(range, &pref_range);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    for (r = 0; r < PCI_NUM_REGIONS; ++r) {
 | 
			
		||||
        PCIIORegion *region = &dev->io_regions[r];
 | 
			
		||||
    for (i = 0; i < PCI_NUM_REGIONS; ++i) {
 | 
			
		||||
        PCIIORegion *r = &dev->io_regions[i];
 | 
			
		||||
        Range region_range;
 | 
			
		||||
 | 
			
		||||
        if (!region->size ||
 | 
			
		||||
            (region->type & PCI_BASE_ADDRESS_SPACE_IO) ||
 | 
			
		||||
            !(region->type & PCI_BASE_ADDRESS_MEM_TYPE_64)) {
 | 
			
		||||
        if (!r->size ||
 | 
			
		||||
            (r->type & PCI_BASE_ADDRESS_SPACE_IO) ||
 | 
			
		||||
            !(r->type & PCI_BASE_ADDRESS_MEM_TYPE_64)) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        region_range.begin = pci_bar_address(dev, i, r->type, r->size);
 | 
			
		||||
        region_range.end = region_range.begin + r->size;
 | 
			
		||||
 | 
			
		||||
        if (region_range.begin == PCI_BAR_UNMAPPED) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        region_range.begin = pci_get_quad(dev->config + pci_bar(dev, r));
 | 
			
		||||
        region_range.end = region_range.begin + region->size;
 | 
			
		||||
 | 
			
		||||
        region_range.begin = MAX(region_range.begin, 0x1ULL << 32);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue