summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Bugaev <bugaevc@gmail.com>2021-11-06 09:13:33 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2021-11-07 17:55:13 +0100
commit21b60d69fadd23e5081d1fd36beeee42f4e7976a (patch)
tree668000df14ef771cad71de276a231b25b41d9e08
parent44ca02a46b6fa0a8f1181fdc08efa779c3bdce80 (diff)
Memory proxies: Add support for anonymous mappings
* vm/vm_map.c (vm_region_get_proxy): - Return KERN_INVALID_ARGUMENT when the entry is a submap. - Create a pager for the vm_object when the entry doesn't have any yet, since it's an anonymous mapping. Message-Id: <20211106081333.10366-3-jlledom@mailfence.com>
-rw-r--r--vm/vm_map.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/vm/vm_map.c b/vm/vm_map.c
index 900862d9..d082171a 100644
--- a/vm/vm_map.c
+++ b/vm/vm_map.c
@@ -4822,6 +4822,7 @@ vm_region_get_proxy (task_t task, vm_address_t address,
{
kern_return_t ret;
vm_map_entry_t entry, tmp_entry;
+ vm_object_t object;
vm_offset_t offset, start;
ipc_port_t pager;
@@ -4838,16 +4839,28 @@ vm_region_get_proxy (task_t task, vm_address_t address,
entry = tmp_entry;
}
+ if (entry->is_sub_map) {
+ vm_map_unlock_read(task->map);
+ return(KERN_INVALID_ARGUMENT);
+ }
+
/* Limit the allowed protection and range to the entry ones */
if (len > entry->vme_end - entry->vme_start) {
vm_map_unlock_read(task->map);
return(KERN_INVALID_ARGUMENT);
}
-
max_protection &= entry->max_protection;
- pager = ipc_port_copy_send(entry->object.vm_object->pager);
- offset = entry->offset;
- start = 0;
+
+ object = entry->object.vm_object;
+ vm_object_lock(object);
+ /* Create a pager in case this is an internal object that does
+ not yet have one. */
+ vm_object_pager_create(object);
+ pager = ipc_port_copy_send(object->pager);
+ vm_object_unlock(object);
+
+ start = (address - entry->vme_start) + entry->offset;
+ offset = 0;
vm_map_unlock_read(task->map);