Date: Tue, 18 Nov 2003 12:49:35 -0800 From: Sean McNeil <sean@mcneil.com> To: freebsd-hackers@freebsd.org Subject: memory address space conversion Message-ID: <1069188575.76277.8.camel@blue.mcneil.com>
next in thread | raw e-mail | index | archive | help
Hello all, I ask a while ago a question and received great response. I'm hoping to repeat the experience :) I have a driver that I cannot change the ioctl API to. Unfortunately, it has a peculiar need to return a user-space address based on the physical address. Here is the scenario: user calls mmap and gets a user-space mapping to a chunk of memory. user calls an ioctl that passes an array of user-space addresses inside that mapping. I had a hack working for the case of a single-threaded process, but it will not work in a threaded environment. Here is what I came up with: static vm_map_entry_t find_entry (vm_map_t map, vm_paddr_t address) { vm_map_entry_t entry; int i; for (i = 0, entry = &map->header; i < map->nentries; i++, entry = entry->next) { vm_page_t page; vm_paddr_t paddr; if (entry->eflags & MAP_ENTRY_IS_SUB_MAP) { vm_map_entry_t sub_entry = find_entry (entry->object.sub_map, address); if (! sub_entry) continue; entry = sub_entry; break; } if (entry->object.vm_object == NULL) continue; VM_OBJECT_LOCK (entry->object.vm_object); page = vm_page_lookup (entry->object.vm_object, OFF_TO_IDX(MMAP_OFFSET)); paddr = (page) ? VM_PAGE_TO_PHYS (page) : 0; VM_OBJECT_UNLOCK (entry->object.vm_object); if (paddr == address) break; } return (i < map->nentries) ? entry : NULL; } where MMAP_OFFSET is 0x40000000. This was the offset passed in by the mmap call. Does anyone know of a more proper mechanism that will work for the threaded model? Any and all assistance will be greatly appreciated. TIA, Sean
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1069188575.76277.8.camel>