|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/5] xen/alternatives: Plumb a 'live' parameter through apply_alternatives()
On Mon, 29 Jan 2018, Andrew Cooper wrote:
> On x86, we would like to alter how we patch based on whether there is any
> chance of the code being patched being concurrently executed.
>
> prepare_payload() passes false (as the livepatch definitely isn't live at this
> point), whereas the boot-time alternatives application passes true.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Acked-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> CC: Julien Grall <julien.grall@xxxxxxx>
> CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> CC: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>
> ---
> xen/arch/arm/alternative.c | 10 ++++++----
> xen/arch/x86/alternative.c | 5 +++--
> xen/common/livepatch.c | 2 +-
> xen/include/asm-arm/alternative.h | 6 ++++--
> xen/include/asm-x86/alternative.h | 3 ++-
> 5 files changed, 16 insertions(+), 10 deletions(-)
>
> diff --git a/xen/arch/arm/alternative.c b/xen/arch/arm/alternative.c
> index 99112e1..078b259 100644
> --- a/xen/arch/arm/alternative.c
> +++ b/xen/arch/arm/alternative.c
> @@ -98,7 +98,8 @@ static u32 get_alt_insn(const struct alt_instr *alt,
> * The region patched should be read-write to allow __apply_alternatives
> * to replacing the instructions when necessary.
> */
> -static void __apply_alternatives(const struct alt_region *region)
> +static void __apply_alternatives(const struct alt_region *region,
> + bool live)
> {
> const struct alt_instr *alt;
> const u32 *replptr;
> @@ -193,7 +194,7 @@ static int __init __apply_alternatives_multi_stop(void
> *unused)
> region.begin = (void *)__alt_instructions - (void *)_start + xenmap;
> region.end = (void *)__alt_instructions_end - (void *)_start +
> xenmap;
>
> - __apply_alternatives(®ion);
> + __apply_alternatives(®ion, true);
>
> unregister_virtual_region(&patch_region);
>
> @@ -224,14 +225,15 @@ void __init apply_alternatives_all(void)
> }
>
> void apply_alternatives(const struct alt_instr *start,
> - const struct alt_instr *end)
> + const struct alt_instr *end,
> + bool live)
> {
> const struct alt_region region = {
> .begin = start,
> .end = end,
> };
>
> - __apply_alternatives(®ion);
> + __apply_alternatives(®ion, live);
> }
>
> /*
> diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c
> index ee18e6c..5b3fb80 100644
> --- a/xen/arch/x86/alternative.c
> +++ b/xen/arch/x86/alternative.c
> @@ -163,7 +163,8 @@ text_poke(void *addr, const void *opcode, size_t len)
> * Tough. Make sure you disable such features by hand.
> */
> void init_or_livepatch apply_alternatives(const struct alt_instr *start,
> - const struct alt_instr *end)
> + const struct alt_instr *end,
> + bool live)
> {
> const struct alt_instr *a;
> u8 *instr, *replacement;
> @@ -235,7 +236,7 @@ void __init alternative_instructions(void)
> /* Disable WP to allow application of alternatives to read-only pages. */
> write_cr0(cr0 & ~X86_CR0_WP);
>
> - apply_alternatives(__alt_instructions, __alt_instructions_end);
> + apply_alternatives(__alt_instructions, __alt_instructions_end, true);
>
> /* Reinstate WP. */
> write_cr0(cr0);
> diff --git a/xen/common/livepatch.c b/xen/common/livepatch.c
> index b9376c9..6f03e89 100644
> --- a/xen/common/livepatch.c
> +++ b/xen/common/livepatch.c
> @@ -682,7 +682,7 @@ static int prepare_payload(struct payload *payload,
> return -EINVAL;
> }
> }
> - apply_alternatives(start, end);
> + apply_alternatives(start, end, false);
> #else
> dprintk(XENLOG_ERR, LIVEPATCH "%s: We don't support alternative
> patching!\n",
> elf->name);
> diff --git a/xen/include/asm-arm/alternative.h
> b/xen/include/asm-arm/alternative.h
> index 49a055e..77b0944 100644
> --- a/xen/include/asm-arm/alternative.h
> +++ b/xen/include/asm-arm/alternative.h
> @@ -26,7 +26,8 @@ struct alt_instr {
>
> void __init apply_alternatives_all(void);
> void apply_alternatives(const struct alt_instr *start,
> - const struct alt_instr *end);
> + const struct alt_instr *end,
> + bool live);
>
> #define ALTINSTR_ENTRY(feature)
> \
> " .word 661b - .\n" /* label */ \
> @@ -160,7 +161,8 @@ static inline void apply_alternatives_all(void)
> }
>
> static inline void apply_alternatives(const struct alt_instr *start,
> - const struct alt_instr *end)
> + const struct alt_instr *end,
> + bool live)
> {
> }
>
> diff --git a/xen/include/asm-x86/alternative.h
> b/xen/include/asm-x86/alternative.h
> index ba537d6..07ff424 100644
> --- a/xen/include/asm-x86/alternative.h
> +++ b/xen/include/asm-x86/alternative.h
> @@ -23,7 +23,8 @@ struct alt_instr {
> extern void add_nops(void *insns, unsigned int len);
> /* Similar to alternative_instructions except it can be run with IRQs
> enabled. */
> extern void apply_alternatives(const struct alt_instr *start,
> - const struct alt_instr *end);
> + const struct alt_instr *end,
> + bool live);
> extern void alternative_instructions(void);
>
> #define OLDINSTR(oldinstr) "661:\n\t" oldinstr "\n662:\n"
> --
> 2.1.4
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |