summaryrefslogtreecommitdiff
path: root/src/x86_pci.c
diff options
context:
space:
mode:
authorJoan Lledó <jlledom@member.fsf.org>2022-01-05 13:08:01 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2022-01-08 21:52:16 +0100
commit3e0d1cde01872d605c267c61094e44315a3e7467 (patch)
tree35b952f61e0a05d3ad2b439c2be246878cee9efe /src/x86_pci.c
parent9c01fdd7c02d8b9b5003e659ebca0b3643bd47c4 (diff)
downloadlibpciaccess-3e0d1cde01872d605c267c61094e44315a3e7467.tar.gz
hurd: Implement device memory mapping
* src/hurd_pci.c: * Implement device memory mapping functions * pci_device_hurd_map_range * pci_device_hurd_unmap_range * pci_device_hurd_map_legacy * pci_device_hurd_unmap_legacy * src/x86_pci.h: * Remove unused declarations * pci_device_x86_map_range() * pci_device_x86_unmap_range() * pci_device_x86_map_legacy() * pci_device_x86_unmap_legacy() * src/x86_pci.c: * Fix port leaks * Make mapping function static again * map_dev_mem(): use device_map() support for offsets Message-Id: <20220105120802.14008-2-jlledom@mailfence.com> Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Diffstat (limited to 'src/x86_pci.c')
-rw-r--r--src/x86_pci.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/x86_pci.c b/src/x86_pci.c
index 565dbc8..86be0e7 100644
--- a/src/x86_pci.c
+++ b/src/x86_pci.c
@@ -263,6 +263,7 @@ map_dev_mem(void **dest, size_t mem_offset, size_t mem_size, int write)
}
err = device_open (master_device, mode, "mem", &devmem);
+ mach_port_deallocate (mach_task_self (), master_device);
if (err)
return err;
@@ -270,17 +271,21 @@ map_dev_mem(void **dest, size_t mem_offset, size_t mem_size, int write)
if (mem_size % pagesize)
mem_size += pagesize - (mem_size % pagesize);
- /* XXX: Mach should be fixed into supporting non-zero offset */
- err = device_map (devmem, prot, 0x0, mem_offset + mem_size, &pager, 0);
+ err = device_map (devmem, prot, mem_offset, mem_size, &pager, 0);
+ device_close (devmem);
+ mach_port_deallocate (mach_task_self (), devmem);
if (err)
return err;
err = vm_map (mach_task_self (), (vm_address_t *)dest, mem_size,
(vm_address_t) 0, /* mask */
1, /* anywhere? */
- pager, mem_offset,
+ pager, 0,
0, /* copy */
prot, VM_PROT_ALL, VM_INHERIT_SHARE);
+ mach_port_deallocate (mach_task_self (), pager);
+ if (err)
+ return err;
return err;
#else
@@ -908,19 +913,19 @@ pci_device_x86_unmap_range(struct pci_device *dev,
#else
-int
+static int
pci_device_x86_map_range(struct pci_device *dev,
struct pci_device_mapping *map)
{
int err;
- if ( (err = map_dev_mem(&map->memory, map->base,
- map->size, map->flags & PCI_DEV_MAP_FLAG_WRITABLE)) )
+ if ( (err = map_dev_mem(&map->memory, map->base, map->size,
+ map->flags & PCI_DEV_MAP_FLAG_WRITABLE)))
return err;
return 0;
}
-int
+static int
pci_device_x86_unmap_range(struct pci_device *dev,
struct pci_device_mapping *map)
{
@@ -1099,7 +1104,7 @@ pci_device_x86_write8(struct pci_io_handle *handle, uint32_t reg,
outb(data, reg + handle->base);
}
-int
+static int
pci_device_x86_map_legacy(struct pci_device *dev, pciaddr_t base,
pciaddr_t size, unsigned map_flags, void **addr)
{
@@ -1115,7 +1120,7 @@ pci_device_x86_map_legacy(struct pci_device *dev, pciaddr_t base,
return err;
}
-int
+static int
pci_device_x86_unmap_legacy(struct pci_device *dev, void *addr,
pciaddr_t size)
{