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

Re: [Xen-devel] [PATCH] x86/xenoprof: fix 32-bit guest stack handling after c/s 24537:3c0a533d3af0



On 06/03/2012 15:04, "Jan Beulich" <JBeulich@xxxxxxxx> wrote:

> 32-bit guests don't have 64-bit precudrure return addresses - both
> elements of struct frame_head_32bit should be 32 bits wide, not just
> the frame link pointer.
> 
> Further, consolidate the whole handling here (also in the native size
> guest case) to properly use guest handles and guest memory accessors.
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>

Acked-by: Keir Fraser <keir@xxxxxxx>

> --- a/xen/arch/x86/oprofile/backtrace.c
> +++ b/xen/arch/x86/oprofile/backtrace.c
> @@ -13,18 +13,22 @@
>  #include<xen/types.h>
>  #include<asm/page.h>
>  #include<xen/xenoprof.h>
> -#include<asm/guest_access.h>
> +#include<xen/guest_access.h>
>  
>  struct frame_head {
>      struct frame_head * ebp;
>      unsigned long ret;
>  } __attribute__((packed));
> +typedef struct frame_head frame_head_t;
> +DEFINE_XEN_GUEST_HANDLE(frame_head_t);
>  
>  #ifdef CONFIG_X86_64
>  struct frame_head_32bit {
>      uint32_t ebp;
> -    unsigned long ret;
> +    uint32_t ret;
>  } __attribute__((packed));
> +typedef struct frame_head_32bit frame_head32_t;
> +DEFINE_COMPAT_HANDLE(frame_head32_t);
>  #endif
>  
>  static struct frame_head *
> @@ -54,44 +58,47 @@ static inline int is_32bit_vcpu(struct v
>  
>  static struct frame_head *
>  dump_guest_backtrace(struct domain *d, struct vcpu *vcpu,
> -       struct frame_head * head, int mode)
> +       const struct frame_head *head, int mode)
>  {
> -    struct frame_head bufhead[2];
> -    XEN_GUEST_HANDLE(char) guest_head = guest_handle_from_ptr(head, char);
> +    frame_head_t bufhead;
>  
>  #ifdef CONFIG_X86_64
>      if ( is_32bit_vcpu(vcpu) )
>      {
> -        struct frame_head_32bit bufhead32[2];
> +        __compat_handle_const_frame_head32_t guest_head =
> +            { .c = (unsigned long)head };
> +        frame_head32_t bufhead32;
> +
>          /* Also check accessibility of one struct frame_head beyond */
> -        if (!guest_handle_okay(guest_head, sizeof(bufhead32)))
> +        if (!compat_handle_okay(guest_head, 2))
>              return 0;
> -        if (__copy_from_guest_offset((char *)bufhead32, guest_head, 0,
> -                                     sizeof(bufhead32)))
> +        if (__copy_from_compat(&bufhead32, guest_head, 1))
>              return 0;
> -        bufhead[0].ebp=(struct frame_head *)(unsigned long)bufhead32[0].ebp;
> -        bufhead[0].ret=bufhead32[0].ret;
> +        bufhead.ebp = (struct frame_head *)(unsigned long)bufhead32.ebp;
> +        bufhead.ret = bufhead32.ret;
>      }
>      else
>  #endif
>      {
> +        XEN_GUEST_HANDLE(const_frame_head_t) guest_head =
> +            const_guest_handle_from_ptr(head, frame_head_t);
> +
>          /* Also check accessibility of one struct frame_head beyond */
> -        if (!guest_handle_okay(guest_head, sizeof(bufhead)))
> +        if (!guest_handle_okay(guest_head, 2))
>              return 0;
> -        if (__copy_from_guest_offset((char *)bufhead, guest_head, 0,
> -                                     sizeof(bufhead)))
> +        if (__copy_from_guest(&bufhead, guest_head, 1))
>              return 0;
>      }
>      
> -    if (!xenoprof_add_trace(d, vcpu, bufhead[0].ret, mode))
> +    if (!xenoprof_add_trace(d, vcpu, bufhead.ret, mode))
>          return 0;
>      
>      /* frame pointers should strictly progress back up the stack
>       * (towards higher addresses) */
> -    if (head >= bufhead[0].ebp)
> +    if (head >= bufhead.ebp)
>          return NULL;
>      
> -    return bufhead[0].ebp;
> +    return bufhead.ebp;
>  }
>  
>  /*
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel



_______________________________________________
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®.