|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 1/3] livepach: Add .livepatch.hooks functions and test-case
>>> On 04.08.16 at 17:49, <konrad.wilk@xxxxxxxxxx> wrote:
> In general, the hooks provide flexibility when having to deal with
> unforeseen cases, but their application should be rarely required (<
> 10%)."
But the greater flexibility of course comes with increased chances
of screwing things up. I'm therefore still not entirely convinced that
such XSAs wouldn't then better not be live patched.
> --- a/xen/arch/x86/test/xen_hello_world.c
> +++ b/xen/arch/x86/test/xen_hello_world.c
> @@ -4,14 +4,50 @@
> */
>
> #include "config.h"
> +#include <xen/lib.h>
> #include <xen/types.h>
> #include <xen/version.h>
> #include <xen/livepatch.h>
> +#include <xen/livepatch_payload.h>
>
> #include <public/sysctl.h>
>
> static char hello_world_patch_this_fnc[] = "xen_extra_version";
> extern const char *xen_hello_world(void);
> +static unsigned int cnt;
> +
> +static void apply_hook(void)
> +{
> + printk(KERN_DEBUG "Hook executing.\n");
> +}
> +
> +static void revert_hook(void)
> +{
> + printk(KERN_DEBUG "Hook unloaded.\n");
> +}
> +
> +static void hi_func(void)
> +{
> + printk(KERN_DEBUG "%s: Hi! (called %u times)\n", __func__, ++cnt);
> +};
> +
> +/* If we are sorted we _MUST_ be the last .livepatch.hook section. */
> +static void Z_check_fnc(void)
And that Z_ prefix is supposed to guarantee that being last? Isn't
it that upper case letters sort before lower case ones?
> +{
> + printk(KERN_DEBUG "%s: Hi func called %u times\n", __func__, cnt);
> + BUG_ON(cnt == 0 || cnt > 2);
> + cnt = 0; /* Otherwise if you revert, apply, revert the value will be 4!
> */
Isn't this an indication of a general weakness: Shouldn't a patch
module be allowed to assume it's being run in a clean state, i.e.
without any of its static data altered from their load time values?
> @@ -70,7 +71,11 @@ struct payload {
> unsigned int nsyms; /* Nr of entries in .strtab and
> symbols. */
> struct livepatch_build_id id; /* ELFNOTE_DESC(.note.gnu.build-id)
> of the payload. */
> struct livepatch_build_id dep; /*
> ELFNOTE_DESC(.livepatch.depends). */
> - char name[XEN_LIVEPATCH_NAME_SIZE]; /* Name of it. */
> + livepatch_loadcall_t **load_funcs; /* The array of funcs to call after
> */
> + livepatch_unloadcall_t **unload_funcs;/* load and unload of the payload.
> */
These both seem like they want a const in the middle.
> @@ -515,6 +520,27 @@ static int prepare_payload(struct payload *payload,
> }
> }
>
> + sec = livepatch_elf_sec_by_name(elf, ".livepatch.hooks.load");
Is the .hooks infix really needed?
> + if ( sec )
> + {
> + if ( !sec->sec->sh_size ||
What's wrong with a zero size section (holding no hooks)? We've
had that same case elsewhere in the original series ...
> @@ -999,6 +1025,17 @@ static int apply_payload(struct payload *data)
>
> arch_livepatch_quiesce();
>
> + /*
> + * The hooks may call common code which expects spinlocks to be certain
> + * type, as such disable this temporarily.
> + */
> + spin_debug_disable();
> + for ( i = 0; i < data->n_load_funcs; i++ )
> + data->load_funcs[i]();
> + spin_debug_enable();
I have to admit that I can't really make sense of the comment, and
hence the code.
> --- /dev/null
> +++ b/xen/include/xen/livepatch_payload.h
> @@ -0,0 +1,49 @@
> +/*
> + * Copyright (C) 2016 Citrix Systems R&D Ltd.
> + */
> +
> +#ifndef __XEN_LIVEPATCH_PAYLOAD_H__
> +#define __XEN_LIVEPATCH_PAYLOAD_H__
> +
> +/*
> + * The following definitions are to be used in patches. They are taken
> + * from kpatch.
> + */
> +typedef void livepatch_loadcall_t(void);
> +typedef void livepatch_unloadcall_t(void);
> +
> +/*
> + * LIVEPATCH_LOAD_HOOK macro
> + *
> + * Declares a function pointer to be allocated in a new
> + * .livepatch.hook.load section. This livepatch_load_data symbol is later
> + * stripped by create-diff-object so that it can be declared in multiple
> + * objects that are later linked together, avoiding global symbol
> + * collision. Since multiple hooks can be registered, the
> + * .livepatch.hook.load section is a table of functions that will be
> + * executed in series by the livepatch infrastructure at patch load time.
> + */
> +#define LIVEPATCH_LOAD_HOOK(_fn) \
> + livepatch_loadcall_t *__attribute__((weak)) \
> + livepatch_load_data_##_fn __section(".livepatch.hooks.load") = _fn;
There's again a const desirable here, to render the section r/o.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |