diff --git a/src/common_interface.c b/src/common_interface.c index 6dccf8e..b8b02d5 100644 --- a/src/common_interface.c +++ b/src/common_interface.c @@ -84,6 +84,8 @@ #endif /* others */ +#define FIX_DEV do { if (dev != NULL) dev = (void*)(((size_t)(pci_device_find_by_slot(0, 1, 0, 0)) & 0xffffffff00000000) | (((size_t)dev)&0xffffffff)); } while (0) + /** * Read a device's expansion ROM. * @@ -104,6 +106,7 @@ pci_device_read_rom( struct pci_device * dev, void * buffer ) return EFAULT; } + FIX_DEV; return (pci_sys->methods->read_rom)( dev, buffer ); } @@ -120,6 +123,7 @@ pci_device_is_boot_vga( struct pci_device * dev ) { if (!pci_sys->methods->boot_vga) return 0; + FIX_DEV; return pci_sys->methods->boot_vga( dev ); } @@ -135,6 +139,7 @@ pci_device_has_kernel_driver( struct pci_device * dev ) { if (!pci_sys->methods->has_kernel_driver) return 0; + FIX_DEV; return pci_sys->methods->has_kernel_driver( dev ); } @@ -159,6 +164,7 @@ pci_device_probe( struct pci_device * dev ) } + FIX_DEV; return (pci_sys->methods->probe)( dev ); } @@ -187,7 +193,9 @@ pci_device_map_region(struct pci_device * dev, unsigned region, const unsigned map_flags = (write_enable) ? PCI_DEV_MAP_FLAG_WRITABLE : 0; - if ((region > 5) || (dev->regions[region].size == 0)) { + FIX_DEV; + + if ((region > 5) || (dev->regions[region].size == 0)) { return ENOENT; } @@ -252,6 +260,7 @@ pci_device_map_range(struct pci_device *dev, pciaddr_t base, pciaddr_t size, unsigned map_flags, void **addr) { + FIX_DEV; struct pci_device_private *const devp = (struct pci_device_private *) dev; struct pci_device_mapping *mappings; @@ -347,6 +356,7 @@ pci_device_unmap_region( struct pci_device * dev, unsigned region ) { int err; + FIX_DEV; if (dev == NULL) { return EFAULT; } @@ -408,6 +418,7 @@ int pci_device_unmap_range(struct pci_device *dev, void *memory, pciaddr_t size) { + FIX_DEV; struct pci_device_private *const devp = (struct pci_device_private *) dev; unsigned i; @@ -483,6 +494,7 @@ pci_device_cfg_read( struct pci_device * dev, void * data, return EFAULT; } + FIX_DEV; return pci_sys->methods->read( dev, data, offset, size, (bytes_read == NULL) ? & scratch : bytes_read ); @@ -494,6 +506,7 @@ pci_device_cfg_read_u8( struct pci_device * dev, uint8_t * data, pciaddr_t offset ) { pciaddr_t bytes; + FIX_DEV; int err = pci_device_cfg_read( dev, data, offset, 1, & bytes ); if ( (err == 0) && (bytes != 1) ) { @@ -509,6 +522,7 @@ pci_device_cfg_read_u16( struct pci_device * dev, uint16_t * data, pciaddr_t offset ) { pciaddr_t bytes; + FIX_DEV; int err = pci_device_cfg_read( dev, data, offset, 2, & bytes ); if ( (err == 0) && (bytes != 2) ) { @@ -525,6 +539,7 @@ pci_device_cfg_read_u32( struct pci_device * dev, uint32_t * data, pciaddr_t offset ) { pciaddr_t bytes; + FIX_DEV; int err = pci_device_cfg_read( dev, data, offset, 4, & bytes ); if ( (err == 0) && (bytes != 4) ) { @@ -570,6 +585,7 @@ pci_device_cfg_write( struct pci_device * dev, const void * data, return EFAULT; } + FIX_DEV; return pci_sys->methods->write( dev, data, offset, size, (bytes_written == NULL) ? & scratch : bytes_written ); @@ -581,6 +597,7 @@ pci_device_cfg_write_u8(struct pci_device *dev, uint8_t data, pciaddr_t offset) { pciaddr_t bytes; + FIX_DEV; int err = pci_device_cfg_write(dev, & data, offset, 1, & bytes); if ( (err == 0) && (bytes != 1) ) { @@ -598,6 +615,7 @@ pci_device_cfg_write_u16(struct pci_device *dev, uint16_t data, { pciaddr_t bytes; const uint16_t temp = HTOLE_16(data); + FIX_DEV; int err = pci_device_cfg_write( dev, & temp, offset, 2, & bytes ); if ( (err == 0) && (bytes != 2) ) { @@ -615,6 +633,7 @@ pci_device_cfg_write_u32(struct pci_device *dev, uint32_t data, { pciaddr_t bytes; const uint32_t temp = HTOLE_32(data); + FIX_DEV; int err = pci_device_cfg_write( dev, & temp, offset, 4, & bytes ); if ( (err == 0) && (bytes != 4) ) { @@ -633,6 +652,7 @@ pci_device_cfg_write_bits( struct pci_device * dev, uint32_t mask, uint32_t temp; int err; + FIX_DEV; err = pci_device_cfg_read_u32( dev, & temp, offset ); if ( ! err ) { temp &= ~mask; @@ -651,6 +671,7 @@ pci_device_enable(struct pci_device *dev) return; } + FIX_DEV; if (pci_sys->methods->enable) pci_sys->methods->enable(dev); } @@ -677,6 +698,7 @@ pci_device_map_legacy(struct pci_device *dev, pciaddr_t base, pciaddr_t size, if (!pci_sys->methods->map_legacy) return ENOSYS; + FIX_DEV; return pci_sys->methods->map_legacy(dev, base, size, map_flags, addr); } @@ -696,5 +718,6 @@ pci_device_unmap_legacy(struct pci_device *dev, void *addr, pciaddr_t size) if (!pci_sys->methods->unmap_legacy) return ENOSYS; + FIX_DEV; return pci_sys->methods->unmap_legacy(dev, addr, size); } diff --git a/src/common_io.c b/src/common_io.c index f5c9e45..0a07d86 100644 --- a/src/common_io.c +++ b/src/common_io.c @@ -28,6 +28,7 @@ #include "pciaccess.h" #include "pciaccess_private.h" +#define FIX_DEV do { if (dev != NULL) dev = (void*)(((size_t)(pci_device_find_by_slot(0, 1, 0, 0)) & 0xffffffff00000000) | (((size_t)dev)&0xffffffff)); } while (0) static struct pci_io_handle * new_io_handle(void) { @@ -69,6 +70,8 @@ pci_device_open_io(struct pci_device *dev, pciaddr_t base, pciaddr_t size) if (!pci_sys->methods->open_device_io) return NULL; + FIX_DEV; + for (bar = 0; bar < 6; bar++) { struct pci_mem_region *region = &(dev->regions[bar]); if (!region->is_IO) @@ -110,6 +113,8 @@ pci_legacy_open_io(struct pci_device *dev, pciaddr_t base, pciaddr_t size) if (!pci_sys->methods->open_legacy_io) return NULL; + FIX_DEV; + ret = new_io_handle(); if (!ret) return NULL; @@ -128,6 +133,8 @@ pci_legacy_open_io(struct pci_device *dev, pciaddr_t base, pciaddr_t size) void pci_device_close_io(struct pci_device *dev, struct pci_io_handle *handle) { + FIX_DEV; + if (dev && handle && pci_sys->methods->close_io) pci_sys->methods->close_io(dev, handle);