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

Re: [Xen-devel] [PATCH v1 11/11] xsplice: Add support for alternatives



On Tue, Nov 03, 2015 at 06:16:08PM +0000, Ross Lagerwall wrote:
> Add support for applying alternative sections within xsplice modules. At
> module load time, apply any alternative sections that are found.
> 
> Signed-off-by: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>
> ---
>  xen/arch/x86/Makefile             |  2 +-
>  xen/arch/x86/alternative.c        | 12 ++++++------
>  xen/common/xsplice.c              | 11 +++++++++++
>  xen/include/asm-x86/alternative.h |  1 +
>  4 files changed, 19 insertions(+), 7 deletions(-)
> 
> diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile
> index 6e05532..5dbe2e8 100644
> --- a/xen/arch/x86/Makefile
> +++ b/xen/arch/x86/Makefile
> @@ -7,7 +7,7 @@ subdir-y += oprofile
>  
>  subdir-$(x86_64) += x86_64
>  
> -obj-bin-y += alternative.init.o
> +obj-bin-y += alternative.o
>  obj-y += apic.o
>  obj-y += bitops.o
>  obj-bin-y += bzimage.init.o
> diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c
> index 46ac0fd..8d895ad 100644
> --- a/xen/arch/x86/alternative.c
> +++ b/xen/arch/x86/alternative.c
> @@ -28,7 +28,7 @@
>  extern struct alt_instr __alt_instructions[], __alt_instructions_end[];
>  
>  #ifdef K8_NOP1
> -static const unsigned char k8nops[] __initconst = {
> +static const unsigned char k8nops[] = {
>      K8_NOP1,
>      K8_NOP2,
>      K8_NOP3,
> @@ -52,7 +52,7 @@ static const unsigned char * const k8_nops[ASM_NOP_MAX+1] = 
> {
>  #endif
>  
>  #ifdef P6_NOP1
> -static const unsigned char p6nops[] __initconst = {
> +static const unsigned char p6nops[] = {
>      P6_NOP1,
>      P6_NOP2,
>      P6_NOP3,
> @@ -75,7 +75,7 @@ static const unsigned char * const p6_nops[ASM_NOP_MAX+1] = 
> {
>  };
>  #endif
>  
> -static const unsigned char * const *ideal_nops __initdata = k8_nops;
> +static const unsigned char * const *ideal_nops = k8_nops;
>  
>  static int __init mask_nmi_callback(const struct cpu_user_regs *regs, int 
> cpu)
>  {
> @@ -100,7 +100,7 @@ static void __init arch_init_ideal_nops(void)
>  }
>  
>  /* Use this to add nops to a buffer, then text_poke the whole buffer. */
> -static void __init add_nops(void *insns, unsigned int len)
> +static void add_nops(void *insns, unsigned int len)
>  {
>      while ( len > 0 )
>      {
> @@ -127,7 +127,7 @@ static void __init add_nops(void *insns, unsigned int len)
>   *
>   * This routine is called with local interrupt disabled.
>   */
> -static void *__init text_poke_early(void *addr, const void *opcode, size_t 
> len)
> +static void *text_poke_early(void *addr, const void *opcode, size_t len)
>  {
>      memcpy(addr, opcode, len);
>      sync_core();
> @@ -142,7 +142,7 @@ static void *__init text_poke_early(void *addr, const 
> void *opcode, size_t len)
>   * APs have less capabilities than the boot processor are not handled.
>   * Tough. Make sure you disable such features by hand.
>   */
> -static void __init apply_alternatives(struct alt_instr *start, struct 
> alt_instr *end)
> +void apply_alternatives(struct alt_instr *start, struct alt_instr *end)
>  {
>      struct alt_instr *a;
>      u8 *instr, *replacement;
> diff --git a/xen/common/xsplice.c b/xen/common/xsplice.c
> index c5a403b..6a368af 100644
> --- a/xen/common/xsplice.c
> +++ b/xen/common/xsplice.c
> @@ -682,6 +682,17 @@ static int find_special_sections(struct payload *payload,
>      payload->funcs = (struct xsplice_patch_func *)sec->load_addr;
>      payload->nfuncs = sec->sec->sh_size / (sizeof *payload->funcs);
>  
> +#ifdef CONFIG_X86
> +    sec = xsplice_elf_sec_by_name(elf, ".altinstructions");
> +    if ( sec )
> +    {
> +        local_irq_disable();
> +        apply_alternatives((struct alt_instr *)sec->load_addr,
> +                           (struct alt_instr *)(sec->load_addr + 
> sec->sec->sh_size));

Before we do that we need to double-check that 'sh_size' is the proper
size (size aligns with the size of the structure) and that it does not
have some funny value (0).

> +        local_irq_enable();
> +    }
> +#endif
> +
>      for ( i = 0; i < 4; i++ )
>      {
>          char str[14];
> diff --git a/xen/include/asm-x86/alternative.h 
> b/xen/include/asm-x86/alternative.h
> index 23c9b9f..8e83572 100644
> --- a/xen/include/asm-x86/alternative.h
> +++ b/xen/include/asm-x86/alternative.h
> @@ -23,6 +23,7 @@ struct alt_instr {
>      u8  replacementlen;     /* length of new instruction, <= instrlen */
>  };
>  
> +extern void apply_alternatives(struct alt_instr *start, struct alt_instr 
> *end);
>  extern void alternative_instructions(void);
>  
>  #define OLDINSTR(oldinstr)      "661:\n\t" oldinstr "\n662:\n"
> -- 
> 2.4.3
> 
> 
> _______________________________________________
> 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®.