From: Joan Lledó <jlle...@member.fsf.org> Use a internal array of pointers instead
* pci-arbiter/device_map.h: * Update device_map_region() prototype * Now it receives an output address as parameter * pci-arbiter/device_map.c: * Update device_map_region() definition to match the new prototype * Support for legacy mappings * When the base address is lower than 1 mb * pci-arbiter/func_files.c: * pci-arbiter/netfs_impl.c: * Update calls to device_map_region to match the new prototype * Use the internal array of pointers instead of region->memory * pci-arbiter/pcifs.h: * struct pcifs_dirent: Declare the internal array of pointers --- pci-arbiter/device_map.c | 13 +++++++++---- pci-arbiter/device_map.h | 2 +- pci-arbiter/func_files.c | 6 +++--- pci-arbiter/netfs_impl.c | 8 +++++--- pci-arbiter/pcifs.h | 7 +++++++ 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/pci-arbiter/device_map.c b/pci-arbiter/device_map.c index 216adfb9..aa7fed0b 100644 --- a/pci-arbiter/device_map.c +++ b/pci-arbiter/device_map.c @@ -24,14 +24,19 @@ #include "device_map.h" error_t -device_map_region (struct pci_device *device, struct pci_mem_region *region) +device_map_region (struct pci_device *device, struct pci_mem_region *region, + void **addr) { error_t err = 0; - if (region->memory == 0) + if (*addr == 0) { - err = pci_device_map_range (device, region->base_addr, region->size, - PCI_DEV_MAP_FLAG_WRITABLE, ®ion->memory); + if (region->base_addr > 0x100000) + err = pci_device_map_range (device, region->base_addr, region->size, + PCI_DEV_MAP_FLAG_WRITABLE, addr); + else + err = pci_device_map_legacy (device, region->base_addr, region->size, + PCI_DEV_MAP_FLAG_WRITABLE, addr); } return err; diff --git a/pci-arbiter/device_map.h b/pci-arbiter/device_map.h index 9062e901..0d92650c 100644 --- a/pci-arbiter/device_map.h +++ b/pci-arbiter/device_map.h @@ -27,6 +27,6 @@ #include <pciaccess.h> error_t device_map_region (struct pci_device *device, - struct pci_mem_region *region); + struct pci_mem_region *region, void **addr); #endif /* DEVICE_MAP_H */ diff --git a/pci-arbiter/func_files.c b/pci-arbiter/func_files.c index 81ebfded..40706135 100644 --- a/pci-arbiter/func_files.c +++ b/pci-arbiter/func_files.c @@ -205,13 +205,13 @@ io_region_file (struct pcifs_dirent * e, off_t offset, size_t * len, else { /* Ensure the region is mapped */ - err = device_map_region (e->device, region); + err = device_map_region (e->device, region, &e->region_maps[reg_num]); if (err) return err; if (read) - memcpy (data, region->memory + offset, *len); + memcpy (data, e->region_maps[reg_num] + offset, *len); else - memcpy (region->memory + offset, data, *len); + memcpy (e->region_maps[reg_num] + offset, data, *len); } return err; diff --git a/pci-arbiter/netfs_impl.c b/pci-arbiter/netfs_impl.c index 8b4bd22b..63f8354e 100644 --- a/pci-arbiter/netfs_impl.c +++ b/pci-arbiter/netfs_impl.c @@ -591,15 +591,17 @@ netfs_get_filemap (struct node *node, vm_prot_t prot) region = &node->nn->ln->device->regions[reg_num]; /* Ensure the region is mapped */ - err = device_map_region (node->nn->ln->device, region); + err = device_map_region (node->nn->ln->device, region, + &node->nn->ln->region_maps[reg_num]); if (err) return err; /* Create a new memory object proxy with the required protection */ max_prot = (VM_PROT_READ | VM_PROT_WRITE) & prot; err = - vm_region_create_proxy(mach_task_self (), (vm_address_t)region->memory, - max_prot, region->size, &proxy); + vm_region_create_proxy(mach_task_self (), + (vm_address_t)node->nn->ln->region_maps[reg_num], + max_prot, region->size, &proxy); if (err) goto error; diff --git a/pci-arbiter/pcifs.h b/pci-arbiter/pcifs.h index 18f2141c..050c9e32 100644 --- a/pci-arbiter/pcifs.h +++ b/pci-arbiter/pcifs.h @@ -91,6 +91,13 @@ struct pcifs_dirent * Only for entries having a full B/D/F address. */ struct pci_device *device; + + /* + * Array of addresses where regions are mapped + * + * Only when a device is present + */ + void *region_maps[6]; }; /* -- 2.31.1