|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/7] x86/alt: Clean up struct alt_instr and its users
On Mon, Feb 12, 2018 at 11:23:02AM +0000, Andrew Cooper wrote:
> * Rename some fields for consistency and clarity, and use standard types.
> * Don't opencode the use of ALT_{ORIG,REPL}_PTR().
>
> No functional change.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> CC: Wei Liu <wei.liu2@xxxxxxxxxx>
> ---
> xen/arch/x86/alternative.c | 24 ++++++++++++------------
> xen/include/asm-x86/alternative.h | 12 ++++++------
> 2 files changed, 18 insertions(+), 18 deletions(-)
>
> diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c
> index 5c8b6f6..f8ddab5 100644
> --- a/xen/arch/x86/alternative.c
> +++ b/xen/arch/x86/alternative.c
> @@ -163,8 +163,6 @@ void init_or_livepatch apply_alternatives(const struct
> alt_instr *start,
> const struct alt_instr *end)
> {
> const struct alt_instr *a;
> - u8 *instr, *replacement;
> - u8 insnbuf[MAX_PATCH_LEN];
>
> printk(KERN_INFO "alt table %p -> %p\n", start, end);
>
> @@ -179,23 +177,25 @@ void init_or_livepatch apply_alternatives(const struct
> alt_instr *start,
> */
> for ( a = start; a < end; a++ )
> {
> - instr = (u8 *)&a->instr_offset + a->instr_offset;
> - replacement = (u8 *)&a->repl_offset + a->repl_offset;
> - BUG_ON(a->replacementlen > a->instrlen);
> - BUG_ON(a->instrlen > sizeof(insnbuf));
> + uint8_t *orig = ALT_ORIG_PTR(a);
> + uint8_t *repl = ALT_REPL_PTR(a);
> + uint8_t buf[MAX_PATCH_LEN];
> +
> + BUG_ON(a->repl_len > a->orig_len);
> + BUG_ON(a->orig_len > sizeof(buf));
Would be nice to have an assembly BUILD_BUG_ON equivalent so that this
could be turned into a compile time check and added to ALTINSTR_ENTRY.
> BUG_ON(a->cpuid >= NCAPINTS * 32);
> +
> if ( !boot_cpu_has(a->cpuid) )
> continue;
>
> - memcpy(insnbuf, replacement, a->replacementlen);
> + memcpy(buf, repl, a->repl_len);
>
> /* 0xe8/0xe9 are relative branches; fix the offset. */
> - if ( a->replacementlen >= 5 && (*insnbuf & 0xfe) == 0xe8 )
> - *(s32 *)(insnbuf + 1) += replacement - instr;
> + if ( a->repl_len >= 5 && (*buf & 0xfe) == 0xe8 )
> + *(s32 *)(buf + 1) += repl - orig;
(int32_t *)
>
> - add_nops(insnbuf + a->replacementlen,
> - a->instrlen - a->replacementlen);
> - text_poke(instr, insnbuf, a->instrlen);
> + add_nops(buf + a->repl_len, a->orig_len - a->repl_len);
> + text_poke(orig, buf, a->orig_len);
> }
> }
>
> diff --git a/xen/include/asm-x86/alternative.h
> b/xen/include/asm-x86/alternative.h
> index 13ac104..fefa87d 100644
> --- a/xen/include/asm-x86/alternative.h
> +++ b/xen/include/asm-x86/alternative.h
> @@ -9,15 +9,15 @@
> #include <xen/types.h>
>
> struct alt_instr {
> - s32 instr_offset; /* original instruction */
> - s32 repl_offset; /* offset to replacement instruction */
> - u16 cpuid; /* cpuid bit set for replacement */
> - u8 instrlen; /* length of original instruction */
> - u8 replacementlen; /* length of new instruction, <= instrlen */
> + int32_t orig_offset; /* original instruction */
> + int32_t repl_offset; /* offset to replacement instruction */
> + uint16_t cpuid; /* cpuid bit set for replacement */
> + uint8_t orig_len; /* length of original instruction */
> + uint8_t repl_len; /* length of new instruction, <= instrlen */
> };
>
> #define __ALT_PTR(a,f) ((u8 *)((void *)&(a)->f + (a)->f))
While there maybe you could also change the above to uint8_t...
> -#define ALT_ORIG_PTR(a) __ALT_PTR(a, instr_offset)
> +#define ALT_ORIG_PTR(a) __ALT_PTR(a, orig_offset)
> #define ALT_REPL_PTR(a) __ALT_PTR(a, repl_offset)
>
> extern void add_nops(void *insns, unsigned int len);
> --
> 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 |