diff options
author | Sergey Bugaev <bugaevc@gmail.com> | 2021-11-06 09:13:33 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-11-07 17:55:13 +0100 |
commit | 21b60d69fadd23e5081d1fd36beeee42f4e7976a (patch) | |
tree | 668000df14ef771cad71de276a231b25b41d9e08 | |
parent | 44ca02a46b6fa0a8f1181fdc08efa779c3bdce80 (diff) | |
download | gnumach-21b60d69fadd23e5081d1fd36beeee42f4e7976a.tar.gz gnumach-21b60d69fadd23e5081d1fd36beeee42f4e7976a.tar.bz2 gnumach-21b60d69fadd23e5081d1fd36beeee42f4e7976a.zip |
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.c | 21 |
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); |