Skip site navigation (1)Skip section navigation (2)
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>