Applied, thanks!

Flavio Cruz, le mar. 31 janv. 2023 01:08:09 -0500, a ecrit:
> 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.
> ---
>  i386/include/mach/i386/vm_types.h |  3 +++
>  include/mach/mach4.defs           |  8 +++++---
>  vm/memory_object_proxy.c          |  6 +++---
>  vm/memory_object_proxy.h          |  8 --------
>  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);
>  
> -- 
> 2.39.0
> 
> 

-- 
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.

Reply via email to