All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	xen-devel@lists.xenproject.org, konrad@kernel.org,
	ross.lagerwall@citrix.com, mpohlack@amazon.de,
	sasha.levin@oracle.com
Cc: Keir Fraser <keir@xen.org>, Jan Beulich <jbeulich@suse.com>
Subject: Re: [PATCH v6 15/24] xsplice: Add support for exception tables.
Date: Fri, 8 Apr 2016 18:16:16 +0100	[thread overview]
Message-ID: <5707E760.4020006@citrix.com> (raw)
In-Reply-To: <1460000983-28170-16-git-send-email-konrad.wilk@oracle.com>

On 07/04/16 04:49, Konrad Rzeszutek Wilk wrote:
> @@ -48,19 +49,23 @@ static void __init swap_ex(void *a, void *b, int size)
>  }
>  #endif
>  
> -void __init sort_exception_tables(void)
> +void __INIT sort_exception_table(struct exception_table_entry *start,
> +                          struct exception_table_entry *stop)
>  {
> -    sort(__start___ex_table, __stop___ex_table - __start___ex_table,
> -         sizeof(struct exception_table_entry), cmp_ex, swap_ex);
> -    sort(__start___pre_ex_table,
> -         __stop___pre_ex_table - __start___pre_ex_table,
> +    sort(start, stop - start,
>           sizeof(struct exception_table_entry), cmp_ex, swap_ex);

This reminds me that Xen's heapsort implementation is buggy.

By shear luck, it does end up in the correct order, but in O(N^2) time.

I will submit a separate bugfix patch.

>  }
>  
> -static inline unsigned long
> -search_one_table(const struct exception_table_entry *first,
> -                 const struct exception_table_entry *last,
> -                 unsigned long value)
> +void __init sort_exception_tables(void)
> +{
> +    sort_exception_table(__start___ex_table, __stop___ex_table);
> +    sort_exception_table(__start___pre_ex_table, __stop___pre_ex_table);
> +}
> +
> +unsigned long
> +search_one_extable(const struct exception_table_entry *first,
> +                   const struct exception_table_entry *last,
> +                   unsigned long value)
>  {
>      const struct exception_table_entry *mid;
>      long diff;
> @@ -85,7 +90,7 @@ search_exception_table(unsigned long addr)
>      const struct virtual_region *region = find_text_region(addr);
>  
>      if ( region && region->ex )
> -        return search_one_table(region->ex, region->ex_end-1, addr);
> +        return search_one_extable(region->ex, region->ex_end-1, addr);
>  
>      return 0;
>  }
> @@ -94,7 +99,7 @@ unsigned long
>  search_pre_exception_table(struct cpu_user_regs *regs)
>  {
>      unsigned long addr = (unsigned long)regs->eip;
> -    unsigned long fixup = search_one_table(
> +    unsigned long fixup = search_one_extable(
>          __start___pre_ex_table, __stop___pre_ex_table-1, addr);
>      if ( fixup )
>      {
> diff --git a/xen/arch/x86/test/xen_hello_world_func.c b/xen/arch/x86/test/xen_hello_world_func.c
> index 1ad002a..7e239ca 100644
> --- a/xen/arch/x86/test/xen_hello_world_func.c
> +++ b/xen/arch/x86/test/xen_hello_world_func.c
> @@ -5,9 +5,20 @@
>  
>  #include <xen/types.h>
>  
> +static unsigned long *non_canonical_addr = (unsigned long *)(1UL<<48);

I would recommend a more visible hex constant, both for the unlikely
case of patching being broken and Xen actually barfing, and because this
particular non-canonical address will no longer be non-canonical when 5
level paging appears.

how about 0xdead000000000000ULL ?

> +
>  /* Our replacement function for xen_extra_version. */
>  const char *xen_hello_world(void)
>  {
> +    unsigned long tmp = 0xdeadbeef;

No need to initialise.

> +    int rc;
> +    /*
> +     * Any BUG, or WARN_ON will contain symbol and payload name. Furthermore
> +     * exceptions will be caught and processed properly.
> +     */
> +    rc = __get_user(tmp, non_canonical_addr);
> +    BUG_ON(rc != -EFAULT);
> +
>      return "Hello World";
>  }
>  
> diff --git a/xen/common/xsplice.c b/xen/common/xsplice.c
> index 087cb94..31ddd5d 100644
> --- a/xen/common/xsplice.c
> +++ b/xen/common/xsplice.c
> @@ -525,6 +525,31 @@ static int prepare_payload(struct payload *payload,
>                                        sizeof(*region->frame[i].bugs);
>      }
>  
> +#ifdef CONFIG_X86
> +    sec = xsplice_elf_sec_by_name(elf, ".ex_table");
> +    if ( sec )
> +    {
> +        struct exception_table_entry *s, *e;
> +
> +        if ( !sec->sec->sh_size ||
> +             (sec->sec->sh_size % sizeof(*region->ex)) )
> +        {
> +            dprintk(XENLOG_DEBUG, XSPLICE "%s: Wrong size of .ex_table (exp:%lu vs %lu)!\n",
> +                    elf->name, sizeof(*region->ex),
> +                    sec->sec->sh_size);
> +            return -EINVAL;
> +        }
> +
> +        s = sec->load_addr;
> +        e = sec->load_addr + sec->sec->sh_size;
> +
> +        sort_exception_table(s ,e);
> +
> +        region->ex = (const struct exception_table_entry *)s;
> +        region->ex_end = (const struct exception_table_entry *)e;

These casts should not be needed at all.

> +    }
> +#endif
> +
>      return 0;
>  }
>  
> diff --git a/xen/include/asm-x86/uaccess.h b/xen/include/asm-x86/uaccess.h
> index 947470d..2c839a9 100644
> --- a/xen/include/asm-x86/uaccess.h
> +++ b/xen/include/asm-x86/uaccess.h
> @@ -277,5 +277,7 @@ extern struct exception_table_entry __stop___pre_ex_table[];
>  
>  extern unsigned long search_exception_table(unsigned long);
>  extern void sort_exception_tables(void);
> +extern void sort_exception_table(struct exception_table_entry *start,
> +                                 struct exception_table_entry *stop);
>  
>  #endif /* __X86_UACCESS_H__ */
> diff --git a/xen/include/xen/xsplice.h b/xen/include/xen/xsplice.h
> index ca78eae..6113061 100644
> --- a/xen/include/xen/xsplice.h
> +++ b/xen/include/xen/xsplice.h
> @@ -37,6 +37,15 @@ struct xsplice_patch_func_internal {
>      } u;
>  };
>  
> +/*
> + * We use alternative and exception table code - which by default are __init
> + * only, however we need them during runtime. These macros allows us to build
> + * the image with these functions built-in. (See the #else below).
> + */
> +#define __INITCONST
> +#define __INITDATA
> +#define __INIT
> +

This isn't very nice, but is probably the best we can do for 4.7

It would be nice to have things like __maybe_init(CONFIG_XSPLICE) , but
then negations get hard (and perhaps this needs more thought).

No major issues, so with the identified things fixed, Reviewed-by:
Andrew Cooper <andrew.cooper3@citrix.com>

>  /* Convenience define for printk. */
>  #define XSPLICE "xsplice: "
>  
> @@ -96,6 +105,14 @@ void arch_xsplice_mask(void);
>  void arch_xsplice_unmask(void);
>  #else
>  
> +/*
> + * If not compiling with xSplice certain functionality should stay as
> + * __init.
> + */
> +#define __INITCONST    __initconst
> +#define __INITDATA     __initdata
> +#define __INIT         __init
> +
>  #include <xen/errno.h> /* For -EOPNOTSUPP */
>  static inline int xsplice_op(struct xen_sysctl_xsplice_op *op)
>  {


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

  reply	other threads:[~2016-04-08 17:16 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-07  3:49 [PATCH v6] xSplice v1 design and implementation Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 01/24] xsplice: Design document Konrad Rzeszutek Wilk
2016-04-07 16:34   ` Ian Jackson
2016-04-07  3:49 ` [PATCH v6 02/24] xen/xsplice: Hypervisor implementation of XEN_XSPLICE_op Konrad Rzeszutek Wilk
2016-04-07 14:47   ` Andrew Cooper
2016-04-08 18:30   ` Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 03/24] libxc: Implementation of XEN_XSPLICE_op in libxc Konrad Rzeszutek Wilk
2016-04-07 19:53   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 04/24] xen-xsplice: Tool to manipulate xsplice payloads Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 05/24] arm/x86: Use struct virtual_region to do bug, symbol, and (x86) exception tables lookup Konrad Rzeszutek Wilk
2016-04-07 20:12   ` Andrew Cooper
2016-04-08 15:30   ` Julien Grall
2016-04-07  3:49 ` [PATCH v6 06/24] x86: Alter nmi_callback_t typedef Konrad Rzeszutek Wilk
2016-04-07 16:35   ` Ian Jackson
2016-04-07 20:13   ` Andrew Cooper
2016-04-08 20:44     ` Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 07/24] arm/x86/vmap: Add vmalloc_type and vm_init_type Konrad Rzeszutek Wilk
2016-04-08 14:22   ` Andrew Cooper
2016-04-08 17:19     ` Jan Beulich
2016-04-09  1:10       ` Konrad Rzeszutek Wilk
2016-04-08 15:32   ` Julien Grall
2016-04-07  3:49 ` [PATCH v6 08/24] xsplice: Add helper elf routines Konrad Rzeszutek Wilk
2016-04-07 16:19   ` Ian Jackson
2016-04-07 17:23     ` Jan Beulich
2016-04-07 20:32     ` Andrew Cooper
2016-04-08 13:26       ` Ian Jackson
2016-04-07 20:43     ` Konrad Rzeszutek Wilk
2016-04-08 14:53   ` Andrew Cooper
2016-04-08 21:26     ` Konrad Rzeszutek Wilk
2016-04-08 22:10       ` Andrew Cooper
2016-04-08 22:48         ` Jan Beulich
2016-04-07  3:49 ` [PATCH v6 09/24] xsplice: Implement payload loading Konrad Rzeszutek Wilk
2016-04-08 15:31   ` Andrew Cooper
2016-04-08 21:10     ` Konrad Rzeszutek Wilk
2016-04-08 21:18       ` Jan Beulich
2016-04-08 22:45         ` Konrad Rzeszutek Wilk
2016-04-08 22:50           ` Jan Beulich
2016-04-09  0:37             ` Konrad Rzeszutek Wilk
2016-04-09 11:48               ` Konrad Rzeszutek Wilk
2016-04-11 15:53               ` Jan Beulich
2016-04-11 16:03                 ` Konrad Rzeszutek Wilk
2016-04-11 16:34                   ` Konrad Rzeszutek Wilk
2016-04-11 16:55                     ` Jan Beulich
2016-04-11 17:08                       ` Konrad Rzeszutek Wilk
2016-04-11 17:26                         ` Jan Beulich
2016-04-11 18:21                           ` Konrad Rzeszutek Wilk
2016-04-11 18:57                             ` Konrad Rzeszutek Wilk
2016-04-08 15:35   ` Julien Grall
2016-04-07  3:49 ` [PATCH v6 10/24] xsplice: Implement support for applying/reverting/replacing patches Konrad Rzeszutek Wilk
2016-04-08 15:36   ` Julien Grall
2016-04-08 16:33   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 11/24] x86/xen_hello_world.xsplice: Test payload for patching 'xen_extra_version' Konrad Rzeszutek Wilk
2016-04-08 15:37   ` Julien Grall
2016-04-08 16:38   ` Andrew Cooper
2016-04-09  0:45   ` Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 12/24] xsplice, symbols: Implement symbol name resolution on address Konrad Rzeszutek Wilk
2016-04-08 16:55   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 13/24] x86, xsplice: Print payload's symbol name and payload name in backtraces Konrad Rzeszutek Wilk
2016-04-08 17:00   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 14/24] xsplice: Add support for bug frames Konrad Rzeszutek Wilk
2016-04-08 17:03   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 15/24] xsplice: Add support for exception tables Konrad Rzeszutek Wilk
2016-04-08 17:16   ` Andrew Cooper [this message]
2016-04-07  3:49 ` [PATCH v6 16/24] xsplice: Add support for alternatives Konrad Rzeszutek Wilk
2016-04-08 17:34   ` Andrew Cooper
2016-04-08 17:57     ` Jan Beulich
2016-04-07  3:49 ` [PATCH v6 17/24] build_id: Provide ld-embedded build-ids Konrad Rzeszutek Wilk
2016-04-08 15:39   ` Julien Grall
2016-04-08 18:07   ` Andrew Cooper
2016-04-08 19:34     ` Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 18/24] HYPERCALL_version_op: Add VERSION_build_id to retrieve build-id Konrad Rzeszutek Wilk
2016-04-08 18:07   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 19/24] libxl: info: Display build_id of the hypervisor using XEN_VERSION_build_id Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 20/24] xsplice: Print build_id in keyhandler and on bootup Konrad Rzeszutek Wilk
2016-04-08 18:12   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 21/24] xsplice: Stacking build-id dependency checking Konrad Rzeszutek Wilk
2016-04-08 18:19   ` Andrew Cooper
2016-04-09  1:43     ` Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 22/24] xsplice/xen_replace_world: Test-case for XSPLICE_ACTION_REPLACE Konrad Rzeszutek Wilk
2016-04-08 18:20   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 23/24] xsplice: Prevent duplicate payloads from being loaded Konrad Rzeszutek Wilk
2016-04-07 16:36   ` Ian Jackson
2016-04-08 18:21   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 24/24] MAINTAINERS/xsplice: Add myself and Ross as the maintainers Konrad Rzeszutek Wilk
2016-04-08 18:21   ` Andrew Cooper

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5707E760.4020006@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=jbeulich@suse.com \
    --cc=keir@xen.org \
    --cc=konrad.wilk@oracle.com \
    --cc=konrad@kernel.org \
    --cc=mpohlack@amazon.de \
    --cc=ross.lagerwall@citrix.com \
    --cc=sasha.levin@oracle.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.