rem: (*address) += map_offset;
add: *_address = (void *)((addr)*_address + map_offset);
context: region_id vm_map_physical_memory(aspace_id aid, const char *name, void **address, int addr_type,	addr size, int lock, addr phys_addr){	vm_region *region;	vm_cache *cache;	vm_cache_ref *cache_ref;	vm_store *store;	addr map_offset;	int err;	vm_address_space *aspace = vm_get_aspace_by_id(aid);	TRACE(("vm_map_physical_memory(aspace = %ld, \"%s\", virtual = %p, spec = %d,"		" size = %lu, lock = %d, phys = %p)\n",		aid, name, address, addr_type, size, lock, (void *)phys_addr));	if (aspace == NULL)		return ERR_VM_INVALID_ASPACE;	// if the physical address is somewhat inside a page,	// move the actual region down to align on a page boundary	map_offset = phys_addr % PAGE_SIZE;	size += map_offset;	phys_addr -= map_offset;	size = PAGE_ALIGN(size);	// create an device store object	store = vm_store_create_device(phys_addr);	if(store == NULL)		panic("vm_create_null_region: vm_store_create_device returned NULL");	cache = vm_cache_create(store);	if(cache == NULL)		panic("vm_create_null_region: vm_cache_create returned NULL");	cache_ref = vm_cache_ref_create(cache);	if(cache_ref == NULL)		panic("vm_create_null_region: vm_cache_ref_create returned NULL");	// tell the page scanner to skip over this region, it's pages are special	cache->scan_skip = 1;	vm_cache_acquire_ref(cache_ref, true);	err = map_backing_store(aspace, store, address, 0, size, addr_type, 0, lock, REGION_NO_PRIVATE_MAP, &region, name);	vm_cache_release_ref(cache_ref);	vm_put_aspace(aspace);	if(err < 0) {		return err;	}	// modify the pointer returned to be offset back into the new region	// the same way the physical address in was offset	(*address) += map_offset;	return region->id;}