+
+ /* ... and overwrite with the real mappings */
+ for (map_pos = 0, pshmobj = pinfo->pshm_memobjects;
+ user_size != 0;
+ map_pos += pshmobj->pshmo_size, pshmobj = pshmobj->pshmo_next) {
+ if (pshmobj == NULL) {
+ /* nothing there to map !? */
+ goto out;
+ }
+ if (file_pos >= map_pos + pshmobj->pshmo_size) {
+ continue;
+ }
+ map_size = pshmobj->pshmo_size - (file_pos - map_pos);
+ if (map_size > user_size) {
+ map_size = user_size;
+ }
+ kret = vm_map_enter_mem_object(
+ user_map,
+ &user_addr,
+ map_size,
+ 0,
+ VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
+ pshmobj->pshmo_memobject,
+ file_pos - map_pos,
+ docow,
+ prot,
+ VM_PROT_DEFAULT,
+ VM_INHERIT_SHARE);
+ if (kret != KERN_SUCCESS)
+ goto out;
+
+ user_addr += map_size;
+ user_size -= map_size;
+ mapped_size += map_size;
+ file_pos += map_size;
+ }
+