diff options
author | Flavio Cruz <flaviocruz@gmail.com> | 2023-01-31 01:08:09 -0500 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-01-31 22:01:16 +0100 |
commit | 804ceef34074c661ce6e44cf4a44d88a501a633e (patch) | |
tree | a00a3dfa270355858f187252faf7be6759f1bc30 | |
parent | ceeb4675f660d0648a7a8bf3e19c0840a6dced2f (diff) | |
download | gnumach-804ceef34074c661ce6e44cf4a44d88a501a633e.tar.gz gnumach-804ceef34074c661ce6e44cf4a44d88a501a633e.tar.bz2 gnumach-804ceef34074c661ce6e44cf4a44d88a501a633e.zip |
Define rpc_vm_size_array_t and rpc_vm_offset_array_t
When generating stubs, Mig will will take the vm_size_array_t and define the
input request struct using rpc_vm_size_t since the size is variable. This will turn cause a mismatch
between types (vm_size_t* vs rpc_vm_size_t*). We could also ask Mig to produce
a prototype by using rpc_vm_size_t*, however we would need to change the implementation
of the RPC to use rpc_* types anyway since we want to avoid another allocation
of the array.
Message-Id: <Y9iwScHpmsgY3V0N@jupiter.tail36e24.ts.net>
-rw-r--r-- | i386/include/mach/i386/vm_types.h | 3 | ||||
-rw-r--r-- | include/mach/mach4.defs | 8 | ||||
-rw-r--r-- | vm/memory_object_proxy.c | 6 | ||||
-rw-r--r-- | vm/memory_object_proxy.h | 8 | ||||
-rw-r--r-- | vm/vm_map.c | 13 |
5 files changed, 18 insertions, 20 deletions
diff --git a/i386/include/mach/i386/vm_types.h b/i386/include/mach/i386/vm_types.h index 663f920a..bd07ef26 100644 --- a/i386/include/mach/i386/vm_types.h +++ b/i386/include/mach/i386/vm_types.h @@ -158,6 +158,9 @@ typedef long_integer_t rpc_long_integer_t; #define convert_long_natural_to_user convert_vm_to_user #define convert_long_natural_from_user convert_vm_from_user +typedef rpc_vm_size_t * rpc_vm_size_array_t; +typedef rpc_vm_offset_t * rpc_vm_offset_array_t; + #endif /* __ASSEMBLER__ */ /* diff --git a/include/mach/mach4.defs b/include/mach/mach4.defs index 53cca7d3..d63d6f77 100644 --- a/include/mach/mach4.defs +++ b/include/mach/mach4.defs @@ -108,14 +108,16 @@ skip /* pc_sampling reserved 4*/; protection MAX_PROTECTION and return it in *PORT. */ type vm_offset_array_t = array[*:1024] of vm_offset_t; type vm_size_array_t = array[*:1024] of vm_size_t; +type rpc_vm_size_array_t = array[*:1024] of rpc_vm_size_t; +type rpc_vm_offset_array_t = array[*:1024] of rpc_vm_offset_t; routine memory_object_create_proxy( task : ipc_space_t; max_protection : vm_prot_t; object : memory_object_array_t = array[*:1024] of mach_port_send_t; - offset : vm_offset_array_t; - start : vm_offset_array_t; - len : vm_size_array_t; + offset : rpc_vm_offset_array_t; + start : rpc_vm_offset_array_t; + len : rpc_vm_size_array_t; out proxy : mach_port_t); /* Gets a proxy to the region that ADDRESS belongs to, starting at the region diff --git a/vm/memory_object_proxy.c b/vm/memory_object_proxy.c index 46a57932..0f1e75e5 100644 --- a/vm/memory_object_proxy.c +++ b/vm/memory_object_proxy.c @@ -133,9 +133,9 @@ memory_object_proxy_notify (mach_msg_header_t *msg) kern_return_t memory_object_create_proxy (ipc_space_t space, vm_prot_t max_protection, ipc_port_t *object, natural_t object_count, - vm_offset_t *offset, natural_t offset_count, - vm_offset_t *start, natural_t start_count, - vm_size_t *len, natural_t len_count, + rpc_vm_offset_t *offset, natural_t offset_count, + rpc_vm_offset_t *start, natural_t start_count, + rpc_vm_size_t *len, natural_t len_count, ipc_port_t *port) { memory_object_proxy_t proxy; diff --git a/vm/memory_object_proxy.h b/vm/memory_object_proxy.h index 97f20b36..8b3f2025 100644 --- a/vm/memory_object_proxy.h +++ b/vm/memory_object_proxy.h @@ -36,12 +36,4 @@ extern kern_return_t memory_object_proxy_lookup (ipc_port_t port, vm_offset_t *start, vm_offset_t *len); -extern kern_return_t -memory_object_create_proxy (ipc_space_t space, vm_prot_t max_protection, - ipc_port_t *object, natural_t object_count, - vm_offset_t *offset, natural_t offset_count, - vm_offset_t *start, natural_t start_count, - vm_size_t *len, natural_t len_count, - ipc_port_t *port); - #endif /* _VM_MEMORY_OBJECT_PROXY_H_ */ diff --git a/vm/vm_map.c b/vm/vm_map.c index bea84a4d..23c4c296 100644 --- a/vm/vm_map.c +++ b/vm/vm_map.c @@ -4804,7 +4804,8 @@ vm_region_create_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; + rpc_vm_offset_t rpc_offset, rpc_start; + rpc_vm_size_t rpc_len = (rpc_vm_size_t) len; ipc_port_t pager; if (task == TASK_NULL) @@ -4840,16 +4841,16 @@ vm_region_create_proxy (task_t task, vm_address_t address, pager = ipc_port_copy_send(object->pager); vm_object_unlock(object); - start = (address - entry->vme_start) + entry->offset; - offset = 0; + rpc_start = (address - entry->vme_start) + entry->offset; + rpc_offset = 0; vm_map_unlock_read(task->map); ret = memory_object_create_proxy(task->itk_space, max_protection, &pager, 1, - &offset, 1, - &start, 1, - &len, 1, port); + &rpc_offset, 1, + &rpc_start, 1, + &rpc_len, 1, port); if (ret) ipc_port_release_send(pager); |