Skip to content
  • Igor Mammedov's avatar
    memory_region_present: return false if address is not found in child MemoryRegion · 8e46bbf3
    Igor Mammedov authored
    Windows XP shows COM2 port as non functional in
    "Device Manager" although no COM2 port backing device
    is present in QEMU.
    
    This regression is really due to
    3bb28b72
    
    ?
        memory: Provide separate handling of unassigned io ports accesses
    
    That is caused by the fact that QEMU reports to
    OSPM that device is present by setting 5th bit in
    PII4XPM.pci_conf[0x67] register when COM2 doesn't
    exist.
    
    It happens due to memory_region_present(io_as, 0x2f8)
    returning false positive since 0x2f8 address eventually
    translates into catchall io_as address space.
    
    Fix memory_region_present(parent, addr) by returning
    true only if addr maps into a MemoryRegion within
    parent (excluding parent itself), to match its
    doc comment.
    
    While at it fix copy/paste error in
    memory_region_present() doc comment.
    
    Note: this is a temporary hack: we really need better handling for
    unassigned regions, we should avoid fallback regions since they are bad
    for performance (breaking radix tree assumption that the data structure
    is sparsely populated); for memory we need to fix this to implement PCI
    master abort properly, anyway.
    
    Cc: Jan Kiszka <jan.kiszka@siemens.com>
    Signed-off-by: default avatarIgor Mammedov <imammedo@redhat.com>
    Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    8e46bbf3