[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2] xen: arm: correct return value of raw_copy_{to/from}_guest_*, raw_clear_guest



On 12/09/2013 12:13 PM, Ian Campbell wrote:
> This is a generic interface which is supposed to return the number of bytes
> which were not copied. Make it so.
> 
> Update the incorrect callers prepare_dtb, decode_thumb{2} and
> xenmem_add_to_physmap_range.
> 
> In the xenmem_add_to_physmap_range case, observe that we are not propagating
> errors from xenmem_add_to_physmap_one and do so.
> 
> In the decode_thumb case and an emacs magic block to decode.c
> 
> Make the flush_dcache parameter to the helper an int while at it.
> 
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Acked-by: Julien Grall <julien.grall@xxxxxxxxxx>

> ---
> v2: Fix xenmem_add_to_physmap_range, which was assuming -errno return codes.
>     Fix raw_copy_from_guest and raw_clear_guest too
> ---
>  xen/arch/arm/decode.c       |   22 ++++++++++++++--------
>  xen/arch/arm/domain_build.c |    8 ++++----
>  xen/arch/arm/guestcopy.c    |   20 +++++++-------------
>  xen/arch/arm/mm.c           |   23 +++++++++++++++++------
>  4 files changed, 42 insertions(+), 31 deletions(-)
> 
> diff --git a/xen/arch/arm/decode.c b/xen/arch/arm/decode.c
> index abe9f26..8880c39 100644
> --- a/xen/arch/arm/decode.c
> +++ b/xen/arch/arm/decode.c
> @@ -36,12 +36,10 @@ static void update_dabt(struct hsr_dabt *dabt, int reg,
>  static int decode_thumb2(register_t pc, struct hsr_dabt *dabt, uint16_t hw1)
>  {
>      uint16_t hw2;
> -    int rc;
>      uint16_t rt;
>  
> -    rc = raw_copy_from_guest(&hw2, (void *__user)(pc + 2), sizeof (hw2));
> -    if ( rc )
> -        return rc;
> +    if ( raw_copy_from_guest(&hw2, (void *__user)(pc + 2), sizeof (hw2)) )
> +        return -EFAULT;
>  
>      rt = (hw2 >> 12) & 0x7;
>  
> @@ -88,11 +86,9 @@ bad_thumb2:
>  static int decode_thumb(register_t pc, struct hsr_dabt *dabt)
>  {
>      uint16_t instr;
> -    int rc;
>  
> -    rc = raw_copy_from_guest(&instr, (void * __user)pc, sizeof (instr));
> -    if ( rc )
> -        return rc;
> +    if ( raw_copy_from_guest(&instr, (void * __user)pc, sizeof (instr)) )
> +        return -EFAULT;
>  
>      switch ( instr >> 12 )
>      {
> @@ -163,3 +159,13 @@ int decode_instruction(const struct cpu_user_regs *regs, 
> struct hsr_dabt *dabt)
>  
>      return 1;
>  }
> +
> +/*
> + * Local variables:
> + * mode: C
> + * c-file-style: "BSD"
> + * c-basic-offset: 4
> + * tab-width: 4
> + * indent-tabs-mode: nil
> + * End:
> + */
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 0269294..73a7cff 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -907,15 +907,15 @@ static int prepare_dtb(struct domain *d, struct 
> kernel_info *kinfo)
>  static void dtb_load(struct kernel_info *kinfo)
>  {
>      void * __user dtb_virt = (void * __user)(register_t)kinfo->dtb_paddr;
> -    unsigned long rc;
> +    unsigned long left;
>  
>      printk("Loading dom0 DTB to 0x%"PRIpaddr"-0x%"PRIpaddr"\n",
>             kinfo->dtb_paddr, kinfo->dtb_paddr + fdt_totalsize(kinfo->fdt));
>  
> -    rc = raw_copy_to_guest_flush_dcache(dtb_virt, kinfo->fdt,
> +    left = raw_copy_to_guest_flush_dcache(dtb_virt, kinfo->fdt,
>                                          fdt_totalsize(kinfo->fdt));
> -    if ( rc != 0 )
> -        panic("Unable to copy the DTB to dom0 memory (rc = %lu)", rc);
> +    if ( left != 0 )
> +        panic("Unable to copy the DTB to dom0 memory (left = %lu bytes)", 
> left);
>      xfree(kinfo->fdt);
>  }
>  
> diff --git a/xen/arch/arm/guestcopy.c b/xen/arch/arm/guestcopy.c
> index 08800a4..bd0a355 100644
> --- a/xen/arch/arm/guestcopy.c
> +++ b/xen/arch/arm/guestcopy.c
> @@ -6,21 +6,19 @@
>  #include <asm/guest_access.h>
>  
>  static unsigned long raw_copy_to_guest_helper(void *to, const void *from,
> -                                              unsigned len, unsigned 
> flush_dcache)
> +                                              unsigned len, int flush_dcache)
>  {
>      /* XXX needs to handle faults */
>      unsigned offset = (vaddr_t)to & ~PAGE_MASK;
>  
>      while ( len )
>      {
> -        int rc;
>          paddr_t g;
>          void *p;
>          unsigned size = min(len, (unsigned)PAGE_SIZE - offset);
>  
> -        rc = gvirt_to_maddr((vaddr_t) to, &g);
> -        if ( rc )
> -            return rc;
> +        if ( gvirt_to_maddr((vaddr_t) to, &g) )
> +            return len;
>  
>          p = map_domain_page(g>>PAGE_SHIFT);
>          p += offset;
> @@ -56,14 +54,12 @@ unsigned long raw_clear_guest(void *to, unsigned len)
>  
>      while ( len )
>      {
> -        int rc;
>          paddr_t g;
>          void *p;
>          unsigned size = min(len, (unsigned)PAGE_SIZE - offset);
>  
> -        rc = gvirt_to_maddr((vaddr_t) to, &g);
> -        if ( rc )
> -            return rc;
> +        if ( gvirt_to_maddr((vaddr_t) to, &g) )
> +            return len;
>  
>          p = map_domain_page(g>>PAGE_SHIFT);
>          p += offset;
> @@ -84,14 +80,12 @@ unsigned long raw_copy_from_guest(void *to, const void 
> __user *from, unsigned le
>  
>      while ( len )
>      {
> -        int rc;
>          paddr_t g;
>          void *p;
>          unsigned size = min(len, (unsigned)(PAGE_SIZE - offset));
>  
> -        rc = gvirt_to_maddr((vaddr_t) from & PAGE_MASK, &g);
> -        if ( rc )
> -            return rc;
> +        if ( gvirt_to_maddr((vaddr_t) from & PAGE_MASK, &g) )
> +            return len;
>  
>          p = map_domain_page(g>>PAGE_SHIFT);
>          p += ((vaddr_t)from & (~PAGE_MASK));
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index 399e546..26ca588 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -1067,22 +1067,33 @@ static int xenmem_add_to_physmap_range(struct domain 
> *d,
>          xen_ulong_t idx;
>          xen_pfn_t gpfn;
>  
> -        rc = copy_from_guest_offset(&idx, xatpr->idxs, xatpr->size-1, 1);
> -        if ( rc < 0 )
> +        if ( unlikely(copy_from_guest_offset(&idx, xatpr->idxs,
> +                                             xatpr->size-1, 1)) )
> +        {
> +            rc = -EFAULT;
>              goto out;
> +        }
>  
> -        rc = copy_from_guest_offset(&gpfn, xatpr->gpfns, xatpr->size-1, 1);
> -        if ( rc < 0 )
> +        if ( unlikely(copy_from_guest_offset(&gpfn, xatpr->gpfns,
> +                                             xatpr->size-1, 1)) )
> +        {
> +            rc = -EFAULT;
>              goto out;
> +        }
>  
>          rc = xenmem_add_to_physmap_one(d, xatpr->space,
>                                         xatpr->foreign_domid,
>                                         idx, gpfn);
> -
> -        rc = copy_to_guest_offset(xatpr->errs, xatpr->size-1, &rc, 1);
>          if ( rc < 0 )
>              goto out;
>  
> +        if ( unlikely(copy_to_guest_offset(xatpr->errs,
> +                                           xatpr->size-1, &rc, 1)) );
> +        {
> +            rc = -EFAULT;
> +            goto out;
> +        }
> +
>          xatpr->size--;
>  
>          /* Check for continuation if it's not the last interation */
> 


-- 
Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.