• Rusty Russell's avatar
    lguest: support backdoor window. · 59eba788
    Rusty Russell authored
    The VIRTIO_PCI_CAP_PCI_CFG in the PCI virtio 1.0 spec allows access to
    the BAR registers without mapping them.  This is a compulsory feature,
    and we implement it here.
    
    There are some subtleties involving access widths which we should
    note:
    
    4.1.4.7.1 Device Requirements: PCI configuration access capability
    
    ...
       Upon detecting driver write access to pci_cfg_data, the device MUST
       execute a write access at offset cap.offset at BAR selected by
       cap.bar using the first cap.length bytes from pci_cfg_data.
    
       Upon detecting driver read access to pci_cfg_data, the device MUST
       execute a read access of length cap.length at offset cap.offset at
       BAR selected by cap.bar and store the first cap.length bytes in
       pci_cfg_data.
    
    So, for a write, we copy into the pci_cfg_data window, then write from
    there out to the BAR.  This works correctly if cap.length != width of
    write.  Similarly, for a read, we read into window from the BAR then
    read the value from there.
    Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
    59eba788
lguest.c 81.5 KB