diff options
author | Joan Lledó <jlledom@member.fsf.org> | 2022-01-05 13:08:01 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2022-01-08 21:52:16 +0100 |
commit | 3e0d1cde01872d605c267c61094e44315a3e7467 (patch) | |
tree | 35b952f61e0a05d3ad2b439c2be246878cee9efe /src/x86_pci.c | |
parent | 9c01fdd7c02d8b9b5003e659ebca0b3643bd47c4 (diff) | |
download | libpciaccess-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.c | 23 |
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) { |